Предупреждение C6385 в Visual Studio - PullRequest
4 голосов
/ 08 января 2020

Кажется, я получаю ошибочное предупреждающее сообщение от Visual Studio 2019 (16.5 Preview, но также и в 16.4 и более ранних версиях). Это ошибка, или я действительно что-то упускаю?

Сгенерированное (точно) предупреждение:

предупреждение C6385: Чтение недопустимых данных из 'prodlist': читаемый размер составляет '(size_t) * 32 + 8' байтов, но Может быть прочитано 64 байта.

Вот код, который генерирует предупреждение (как можно меньше)

#include <cstdint>
#include <string>
#include <iostream>

struct Product {
    std::string price_profile;
};

int getNumRows() {
    return 5;
}

Product *getProductsFromDB( int &numelements ) {
    numelements = 0;

    const int num_rows = getNumRows();
    if ( num_rows == 0 ) {
        numelements = 0;
        return nullptr;
    }

    Product *prodlist = new Product[num_rows];
    for ( int i = 0; i < num_rows; ++i ) {
        prodlist[i].price_profile = "test"; // Warning on this line
    }
    numelements = num_rows;

    return prodlist;
}

int main() {
    int num_rows;
    Product *prodlist = getProductsFromDB( num_rows );
    for ( int i = 0; i < num_rows; ++i ) {
        std::cout << prodlist[i].price_profile;
    }

    getchar();
}

Если я изменю price_profile на int (и соответствующее ему значение), или если я изменю num_rows на постоянную (например, 5), то предупреждение исчезнет.

1 Ответ

3 голосов
/ 08 января 2020

Похоже, что в Visual Studio 2019 Microsoft применяет правила анализа SAL по C и коду C ++ по умолчанию, хотя здесь по-прежнему много ложных срабатываний, как, например, ваш случай.

Одна вещь, которую вы можете сделать на данный момент отключите предупреждение, дающее ложное срабатывание:

#pragma warning(push)
#pragma warning(disable:6385)
Product *getProductsFromDB( int &numelements ) {
 ...
}
#pragma warning(pop)
...