LINUX.ORG.RU

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

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

Я тут решил потестить на тебе свою поделку. Суть поделки такова - искать в коде бинарные операторы (* . % + - & ^ |), операнды которых имеют разную знаковость (signed/unsigned) и результат такого оператора кастится в результате в какой-то другой тип (как бы всегда так). Например:

int i = 0;
unsigned u = -1;
long res = i - u;

резуьтат здесь будет res == UINT_MAX, но скорее всего хотелось -1. Поэтому, на мой взгляд, такие места нужно находить и кастить один из операндов руками через static_cast, чтобы implicit cast не сломал ничего. Т.е. long res = i - static_cast<std::make_signed…>(u);

Вообще, имхо, это недоработка плюсов и нужно менять правила integer promotion, а пока так, буду юзать свои костыли. Подобных дефолтных ворингов нет, ближайший по смыслу Wsign-conversion, но он даёт много ложных сигналов, например operator= или implicit cast без бинарного оператора, в итоге получаешь портянку ворнингов разбираться в которых больно. Например, будет жалоба на получение с вектора элемента через интовый индекс, хотя очевидно, что она здесь не нужна. Обкладывать все подряд static_cast’ами - уродство и ревьюить больно.

В общем сам решай что с этой инфой делать, надо ли править, итог такой https://pastebin.com/kSYd2FVz

ЗЫ: а твои исходники скомпилить до конца не удалось, какие ошибки вываливаются (нет, это не ненайденные либы).

ЗЗЫ:

Поэтому, на мой взгляд, такие места нужно находить и кастить один из операндов руками через static_cast

Нет, лучше не через static_cast, а сделать небольшие функции tosig(), tousig() ибо опять же процитируя себя

Обкладывать все подряд static_cast’ами - уродство и ревьюить больно

Исправление pavlick, :

Я тут решил потестить на тебе свою поделку. Суть поделки такова - искать в коде бинарные операторы (* . % + - & ^ |), операнды которых имеют разную знаковость (signed/unsigned) и результат такого оператора кастится в результате в какой-то другой тип (как бы всегда так). Например:

int i = 0;
unsigned u = -1;
long res = i - u;

резуьтат здесь будет res == UINT_MAX, но скорее всего хотелось -1. Поэтому, на мой взгляд, такие места нужно находить и кастить один из операндов руками через static_cast, чтобы implicit cast не сломал ничего. Т.е. long res = i - static_cast<std::make_signed…>(u);

Вообще, имхо, это недоработка плюсов и нужно менять правила integer promotion, а пока так, буду юзать свои костыли. Подобных дефолтных ворингов нет, ближайший по смыслу Wsign-conversion, но он даёт много ложных сигналов, например operator= или implicit cast без бинарного оператора, в итоге получаешь портянку ворнингов разбираться в которых больно. Например, будет жалоба на получение с вектора элемента через интовый индекс, хотя очевидно, что она здесь не нужна. Обкладывать все подряд static_cast’ами - уродство и ревьюить больно.

В общем сам решай что с этой инфой делать, надо ли править, итог такой https://pastebin.com/kSYd2FVz

ЗЫ: а твои исходники скомпилить до конца не удалось, какие ошибки вываливаются (нет, это не ненайденные либы).

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

Я тут решил потестить на тебе свою поделку. Суть поделки такова - искать в коде бинарные операторы (* . % + - & ^ |), операнды которых имеют разную знаковость (signed/unsigned) и результат такого оператора кастится в результате в какой-то другой тип (как бы всегда так). Например:

int i = 0;
unsigned u = -1;
long res = i - u;

резуьтат здесь будет res == UINT_MAX, но скорее всего хотелось -1. Поэтому, на мой взгляд, такие места нужно находить и кастить один из операндов руками через static_cast, чтобы implicit cast не сломал ничего. Т.е. long res = i - static_cast<std::make_signed…>(u);

Вообще, имхо, это недоработка плюсов и нужно менять правила integer promotion, а пока так, буду юзать свои костыли. Подобных дефолтных ворингов нет, ближайший по смыслу Wsign-conversion, но он даёт много ложных сигналов, например operator= или implicit cast без бинарного оператора, в итоге получаешь портянку ворнингов разбираться в которых больно. Например, будет жалоба на получение с вектора элемента через интовый индекс, хотя очевидно, что она здесь не нужна. Обкладывать все подряд static_cast’ами - уродство и ревьюить больно.

В общем сам решай что с этой инфой делать, надо ли править, итог такой https://pastebin.com/kSYd2FVz