LINUX.ORG.RU

Кстати, а здесь статические анализаторы должны обнаруживать выход за границу:

#include <memory>

int main()
{
    size_t capacity = 16;
    size_t size = 0;
    std::unique_ptr<int[]> data(new int[capacity]);
    size = 10;
    data[10] = 1;
}
?

kamre ★★★
()
Ответ на: комментарий от kamre

А тут и нету выхода за границы.

Для статического контроля за таким в C++ разумнее будет использовать std::array со своим at с индексом в шаблоне и с обычным at (или optional<reference> at(...) без исключений) с проверкой в рантайме.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

А тут и нету выхода за границы.

А чем это принципиально отличается от кода с std::vector? При resize(10) там вполне может получиться capacity > 10, и тогда выхода за границу аллоцированного буфера не будет, хотя будет обращение по индексу >= size().

kamre ★★★
()
Ответ на: комментарий от quest

По факту они даже без опций эту проблему показывают что я выше и привел.

Выход за границу? Не вижу, где они это показывают.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от kamre

А чем это принципиально отличается от кода с std::vector?

В таком коде

    size_t capacity = 16, size = 0;
    int *data = (int*)calloc(capacity, sizeof(int));
    capacity = 0;
    size = 0;
    data[10] = 1;
    free(data);

capacity передаётся по значению, так что как переменная не имеет отношения к data. size вообще не имеет отношения.

Для такого кода:

    std::vector<int> data;
    data.reserve(16);
    data.resize(10);
    data[10] = 1;
    data.at(10) = 1; // std::out_of_range
    data.shrink_to_fit();
    data[10] = 1; // Invalid write

вопрос имеет смысл, конечно. at должен бросать исключение, первый [] не факт что должен хорошо работать (это UB, хотя в нормальной реализации он будет работать), второй — не должен тем более.

quasimoto ★★★★
()
11 апреля 2015 г.
Ответ на: комментарий от anonymous

Врать не надо только

$ clang++ main.cpp 
main.cpp:6:13: warning: implicit conversion from 'int' to 'char' changes value from 32000 to 0 [-Wconstant-conversion]
    v[10] = 32000;
          ~ ^~~~~
1 warning generated.
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.