
Constantine
18.10.2018
13:51:57

Alexey
18.10.2018
13:52:16
я бы за такой код руки рубил бы

Alexander
18.10.2018
13:52:40

Constantine
18.10.2018
13:52:44
ну есть способы человечнее, но это просто ошибка пиваса

Google

Constantine
18.10.2018
13:53:02
он все еще находит ошибку, которая в принципе не существует

Alexander
18.10.2018
13:53:08
но я согласен, что тут анализатор должен ругнуться
но ругнуться он должен по-другому

Constantine
18.10.2018
13:53:33
ну тут code style: не выебывайся разве что

Alexey
18.10.2018
13:53:34
что за магическое число 10?

Alexander
18.10.2018
13:53:52

Constantine
18.10.2018
13:53:54
не писать же std::declval<int>()

Alexey
18.10.2018
13:55:06
sizeof(A)/sizeof(A[0]) - стандартная запись

Constantine
18.10.2018
13:55:24
не более стандартная, чем /sizeof(A[42])

Igor
18.10.2018
13:56:25

Alexey
18.10.2018
13:56:39
пиши в спортлото^W^Wразработчикам

Constantine
18.10.2018
13:57:32
там еще совершенно точно было, что не цепляются макроопределения в вижаке, мб настраивать надо, мне лень было разбираться
int f(TCHAR x) {
if (0xD800 <= x && x < E000) //warning: condition is always false
return 2;
return 1;
}

Google

Igor
18.10.2018
14:00:05
что за магическое число 10?
эх, и вот с одной стороны хочется чтобы анализатор ругался на магические числа, а с другой — во всяком старье вроде int* arr = getCoords() /*library function*/; int x=arr[0], y=arr[1], z=arr[2]; будет вагон и маленькая тележка ругани...

Constantine
18.10.2018
14:00:26
во, вспомнил где можно взять)
//---
#include <map>
#include <cassert>
int main()
{
std::map<int,int> some;
assert(some.size() == 0);
some[0]; //V607, а на самом-то деле просто не хотелось указывать имя типа /*C++03*/
assert(some.size() == 1);
}

Alexey
18.10.2018
14:00:37
вывод: в новых пишите нормально

Constantine
18.10.2018
14:01:38
//----
#include <utility>
class A
{
public:
virtual ~A(){}
};
class B: public A
{
};
void foo(std::pair<int, A*> p)
{
delete p.second;
}
int main()
{
foo(std::make_pair(0, static_cast<A*>(new B()))); //V572, в данном примере тип и правда можно опустить, но в реальном необходима точная шаблонная подстановка
return 0;
}

Alexey
18.10.2018
14:04:10


Constantine
18.10.2018
14:05:40
6.25 - нет ошибок
оригинальный пример:
//---
#include <atlstr.h>
#include <windows.h>
#include <cassert>
template <bool condition>
void compilation_assert()
{
int arr[condition];
arr;
};
#define COMPILATION_ASSERT(condition, error) compilation_assert<condition>();
int main()
{
CString s(_T("\uFEFF\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E!"));
COMPILATION_ASSERT(sizeof(s[0]) == sizeof(wchar_t), _T("Use unicode character set as VS project option"));
if (s[0] == 0xFEFF) //V547 Expression 's[0] == 0xFEFF' is always false. The value range of char type: [-128, 127]
{
s.Delete(0, 1);
MessageBox(NULL, s, _T(""), MB_ICONINFORMATION); //Я знаю точно, [...]
}
}

Alexey
18.10.2018
14:07:21
та же фигня

Constantine
18.10.2018
14:07:28
6.25 ошибок нету
я это все репортил, что-то даже поправили, значит :)
V607 был просто ужасен
//---
#include <vector>
class op_vector
{
public:
std::vector<int> v;
template <typename TFunctor>
void accumulate(TFunctor &functor)
{
for (int i = 0; i < (int)v.size(); ++i)
functor(v[i]); //V607, причем в данном примере у этого метода даже нет ни одной подстановки!
}
};
int main()
{
}

Alexey
18.10.2018
14:09:49
а я бы тут ругнулся на int вместо size_t

Constantine
18.10.2018
14:10:10
size_t в возврате size() вроде считается архитектурной ошибкой С++

Alexey
18.10.2018
14:11:01
это с какого?
самого языка или пользующего кода?

Constantine
18.10.2018
14:12:36
это с какого?
bool someFunc(std::vector<int> v)
{
std::sort(v.begin(), v.end());
for (size_t i = 0; i < v.size() - 1; i++) //PVS уже нашел ошибку?
if (v[i] == v[i+1])
return true;
return false;
}
это с какого?
вообще интересно, задумайтесь, для int[10] что стоит в operator [] как аргумент

Alexey
18.10.2018
14:26:26
не распарсил вопрос

Constantine
18.10.2018
14:26:46
ну какой тип аргумента в
int x[] = { 1, 2, 3 };
x[arg]

Google

Constantine
18.10.2018
14:27:32
видимо, все-таки, ptrdiff_t

Anatoly
18.10.2018
14:29:39
да, и кодогенерация при пробеге по int полегче, поскольку int не обременен гарантиями в случае overflow

Alexander
18.10.2018
14:32:21

Constantine
18.10.2018
14:32:35
и в данном контексте кажется, что это элемент группы разностей указателей в явном виде

Ioann V
18.10.2018
14:34:21

Alexander
18.10.2018
14:34:22
Но это из области фантастики

Ioann V
18.10.2018
14:34:39
Это, пожалуй, важно в данном вопросе

Constantine
18.10.2018
14:35:21

Spoonson
18.10.2018
14:35:32
К слову о size_t и контейнерах - какой нормальный способ обойти вектор с конца вместе с индексом? И без static_cast

Constantine
18.10.2018
14:36:05

Alexey
18.10.2018
14:36:13

Spoonson
18.10.2018
14:37:17

Constantine
18.10.2018
14:37:23

Александр
18.10.2018
14:37:43

Spoonson
18.10.2018
14:38:17
range-based for
и как интерфейс обертки выглядит? Индекс возвращается, или индекс вместе с элементом?

Constantine
18.10.2018
14:38:49

Google

Constantine
18.10.2018
14:40:13
там беда (спасибо комитету за наше счастливое детство!) и нужно две версии

Spoonson
18.10.2018
14:40:31

Constantine
18.10.2018
14:40:49
последнее сокращение для p.element.

Spoonson
18.10.2018
14:41:55
а как же for (auto [index, value] : index_wrapper(vector)) ?
ну да, писать все равно не очень много будет

Constantine
18.10.2018
14:42:20
там только беда, что structured binding делают decltype(auto) и их не волнует
так что indexed/indexed_view
и немного const шаманств, чтобы не путать

Spoonson
18.10.2018
14:45:58

Constantine
18.10.2018
14:46:26

Spoonson
18.10.2018
14:50:29

Constantine
18.10.2018
14:50:35
а как проблема проявляется? не могу пока понять
нашел пример
#include <functional>
#include <utility>
template <typename... Args>
auto proxy(Args&&... args) {
return std::forward_as_tuple<Args...>(args...);
}
int f() {
int x = 0;
auto [y] = proxy(x);
auto z = std::get<0>(proxy(x));
y = 1;
z = 2;
return x; //1
}

Spoonson
18.10.2018
14:54:32
да, теперь все стало ясно. Довольно интересно, почему было сделано именно так комитетом.

olologin
18.10.2018
16:13:12
Господа
помните я рассказывал о нестабильности недавно
которая не ловится валгриндом
и проявляется только при -O2

Google

olologin
18.10.2018
16:13:49
что ещё выяснил:
Нестабильность как-то зависит от рандомизации памяти, типа ASLR
если я ASLR отрубаю в системе - нестабильность стабильно ломается

Alexen
18.10.2018
16:14:41
значит у тебя стабильно кривой код

olologin
18.10.2018
16:14:58
если в одном процессе запускать 10 раз всё с включенным ASLR - нестабильность или стабильно ломается, или стабильно неломается
вот думаю куда теперь отсюда копать

Alexander
18.10.2018
16:15:31
Ты гонял с убсаном?

olologin
18.10.2018
16:15:51
что это? Санитайзер какой?

Alexen
18.10.2018
16:15:58
да

olologin
18.10.2018
16:16:02
Я клангом собирать наш код не могу

Alexen
18.10.2018
16:16:20
так санитайзеры есть и под гцц

olologin
18.10.2018
16:16:22
короче есть какая-то зависимость от расположения дллок в памяти

Alexander
18.10.2018
16:16:28
Ubsan там есть

olologin
18.10.2018
16:16:39
memory санитайзера нет
ок, я если честно о таком не слышал, ща почитаю

Alexen
18.10.2018
16:17:21
у вас в проекте нет memory санитайзера? ну что я могу вам сказать - только посочувствовать