LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

for (auto i = size(); i >= 0; --i) // oops

Так это дефективный код, сразу видно. Скорее всего писался кем-то далёким от нормального программирования. Проверять переход в цикле через ноль через i<0 даже для signed это что-то плохо пахнущее. Ну и auto, да ещё и всунутое внутрь императивного кода, выдаёт с++ника. А ещё скорее всего тут баг - цикл будет сделан size()+1 раз, а не size() раз, как обычно нужно в таких циклах. Вобщем, куда ни глянь, везде проблема в программисте. И да, именно такие недопрограммисты любят int-ы везде сувать, возможно потому что они сглаживают их слабоумие.

Нужно переписать так:

size_t i;
for(i=size(); i--; ) {
}
или так
for(i=size(); i; i--) {
}
Или, если size()+1 циклов там не баг а действительно нужно, то так:
size_t i;
i = size();
do {
} while(i--);

Я говорил что это полезно для корректных программ, для некорректных полезен -fsantize + -fanalyzer.

Я и пишу про корректные программы.

if (ckd_add(&x, x, 10)) goto err;

Это только в новых компиляторах будет работать, для переносимого кода не годится.

Исходная версия firkax, :

for (auto i = size(); i >= 0; --i) // oops

Так это дефективный код, сразу видно. Скорее всего писался кем-то далёким от нормального программирования. Проверять переход в цикле через ноль через i<0 даже для signed это что-то плохо пахнущее. Ну и auto, да ещё и всунутое внутрь императивного кода, выдаёт с++ника. А ещё скорее всего тут баг - цикл будет сделан size()+1 раз, а не size() раз, как обычно нужно в таких циклах. Вобщем, куда ни глянь, везде проблема в программисте. И да, именно такие недопрограммисты любят int-ы везде сувать, возможно потому что они сглаживают их слабоумие.

Нужно переписать так:

size_t i;
for(i=size(); i--; ) {
}
Или, если size()+1 циклов там не баг а действительно нужно, то так:
size_t i;
i = size();
do {
} while(i--);

Я говорил что это полезно для корректных программ, для некорректных полезен -fsantize + -fanalyzer.

Я и пишу про корректные программы.

if (ckd_add(&x, x, 10)) goto err;

Это только в новых компиляторах будет работать, для переносимого кода не годится.