Size: a a a

2020 May 08

m

magras in pro.cxx
Побитый Кирпич
Самое главное, что дискуссия была НЕ ОБ ЭТОМ
Отлично, тогда какое отношение к дискусии имел вектор?
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Отлично, тогда какое отношение к дискусии имел вектор?
Пройдите выше и ознакомтесь
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Вектор аллокает не массив чаров, а void*. И уже в нём создаёт объект и конвертит его в T*. То есть каста char* -> T* там нету
А чем char* отличается от void*?
источник

DF

Dollar Føølish in pro.cxx
Воид тоже не нарушает альясинг
источник

DF

Dollar Føølish in pro.cxx
Вся дискуссия не удалась)
источник
2020 May 09

AZ

Alexander Zaitsev in pro.cxx
источник

V

Vladimir in pro.cxx
Есть такая проблема с одним легаси кодом был создан свой string класс который содержит в себе std:: string и почти делает тоже самое за исключением ограниченного функционала который я вынес в статические методы а сам класс сделал алиас на std::string (using mystring = std::string). Проблема в том что по всей кодбазе может приходить  nullptr от в конструктор std::string (const char*) и все крашется. В предыдущем классе mystring(const char*) была проверка на nullptr.
Вопрос в том как отследить все места где создаётся string от char* без проверки на nullptr или как все это обернуть малой кровью.
источник

AZ

Alexander Zaitsev in pro.cxx
Vladimir
Есть такая проблема с одним легаси кодом был создан свой string класс который содержит в себе std:: string и почти делает тоже самое за исключением ограниченного функционала который я вынес в статические методы а сам класс сделал алиас на std::string (using mystring = std::string). Проблема в том что по всей кодбазе может приходить  nullptr от в конструктор std::string (const char*) и все крашется. В предыдущем классе mystring(const char*) была проверка на nullptr.
Вопрос в том как отследить все места где создаётся string от char* без проверки на nullptr или как все это обернуть малой кровью.
написать враппер, который сигнализирует о подобном в логи или как-то ещё, пофиксить, откатить на std::string
источник

AZ

Alexander Zaitsev in pro.cxx
можешь попробовать покопать в строну статического анализа ещё (скорее всего придётся написать что-то своё для этого, но переиспользовать существующую инфру). Но этот способ намного сложнее и гарантии тебе никакой не даст, хоть и возможно отловит несколько случаев
источник

V

Vladimir in pro.cxx
Alexander Zaitsev
можешь попробовать покопать в строну статического анализа ещё (скорее всего придётся написать что-то своё для этого, но переиспользовать существующую инфру). Но этот способ намного сложнее и гарантии тебе никакой не даст, хоть и возможно отловит несколько случаев
Это все усложняет на порядок
источник

AZ

Alexander Zaitsev in pro.cxx
Vladimir
Это все усложняет на порядок
совершенно верно. поэтому рекомендую враппер
источник

IL

Ignat Loskutov in pro.cxx
Вроде простые случаи достаточно на халяву можно обнаружить:
$ cat a.cpp

struct mystring {
 mystring(const char * __attribute__((nonnull)));
};

void foo(mystring);

void bar(const char *c) {
 return foo(c);
}

int main() {
 bar(nullptr);
}
$ scan-build-11 clang -c a.cpp
scan-build: Using '/usr/lib/llvm-11/bin/clang' for static analysis
a.cpp:10:14: warning: Null pointer passed to 1st parameter expecting 'nonnull' [core.NonNullParamChecker]
 return foo(c);
            ^
1 warning generated.
scan-build: Analysis run complete.
scan-build: 1 bug found.
scan-build: Run 'scan-view /tmp/scan-build-2020-05-09-022120-444134-1' to examine bug reports.
$
источник

AZ

Alexander Zaitsev in pro.cxx
Ignat Loskutov
Вроде простые случаи достаточно на халяву можно обнаружить:
$ cat a.cpp

struct mystring {
 mystring(const char * __attribute__((nonnull)));
};

void foo(mystring);

void bar(const char *c) {
 return foo(c);
}

int main() {
 bar(nullptr);
}
$ scan-build-11 clang -c a.cpp
scan-build: Using '/usr/lib/llvm-11/bin/clang' for static analysis
a.cpp:10:14: warning: Null pointer passed to 1st parameter expecting 'nonnull' [core.NonNullParamChecker]
 return foo(c);
            ^
1 warning generated.
scan-build: Analysis run complete.
scan-build: 1 bug found.
scan-build: Run 'scan-view /tmp/scan-build-2020-05-09-022120-444134-1' to examine bug reports.
$
о, даже так можно. Спасибо :)
источник

V

Vladimir in pro.cxx
Ignat Loskutov
Вроде простые случаи достаточно на халяву можно обнаружить:
$ cat a.cpp

struct mystring {
 mystring(const char * __attribute__((nonnull)));
};

void foo(mystring);

void bar(const char *c) {
 return foo(c);
}

int main() {
 bar(nullptr);
}
$ scan-build-11 clang -c a.cpp
scan-build: Using '/usr/lib/llvm-11/bin/clang' for static analysis
a.cpp:10:14: warning: Null pointer passed to 1st parameter expecting 'nonnull' [core.NonNullParamChecker]
 return foo(c);
            ^
1 warning generated.
scan-build: Analysis run complete.
scan-build: 1 bug found.
scan-build: Run 'scan-view /tmp/scan-build-2020-05-09-022120-444134-1' to examine bug reports.
$
Круто не знал про этот атрибут
Прикол в том что nullptr может приходить из базы или сети в рантаеме  и тестов что покрывают все возможные случаии нету. Спасибо.
источник

AD

Andrey Davydov in pro.cxx
Vladimir
Есть такая проблема с одним легаси кодом был создан свой string класс который содержит в себе std:: string и почти делает тоже самое за исключением ограниченного функционала который я вынес в статические методы а сам класс сделал алиас на std::string (using mystring = std::string). Проблема в том что по всей кодбазе может приходить  nullptr от в конструктор std::string (const char*) и все крашется. В предыдущем классе mystring(const char*) была проверка на nullptr.
Вопрос в том как отследить все места где создаётся string от char* без проверки на nullptr или как все это обернуть малой кровью.
struct my_string : std::string {
 using std::string::string;
 my_string(const char * s) : std::string(s ? s : "") {}
};

Кажется, довольно мало крови.
источник

V

Vladimir in pro.cxx
Andrey Davydov
struct my_string : std::string {
 using std::string::string;
 my_string(const char * s) : std::string(s ? s : "") {}
};

Кажется, довольно мало крови.
Это вариант но не хорошо так делать в std::string нету виртуального деструкора и код базе есть места где используется указатель на std::string так что хочется по дальше от греха
источник

V

Vladimir in pro.cxx
Нормально отформатируй такое читать никто не будет
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
@supapro. Только сформулируй вопрос покороче и код на пасту
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Vladimir
Это вариант но не хорошо так делать в std::string нету виртуального деструкора и код базе есть места где используется указатель на std::string так что хочется по дальше от греха
Виртуальный деструктор не нужен, если объекты не удаляются полиморфно
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Там строки ньюкаются что ли?
источник