Re[7]: Разрушился стек в приложении на Qt
От: Zhendos  
Дата: 18.08.17 08:33
Оценка:
Здравствуйте, Кузнец, Вы писали:

К>Здравствуйте, Кузнец, Вы писали:


К>>Собрался в релизе — вывод от санитайзера был, в дебуге ни в какую не хочет, где я мог накосячить?


К>В дебуге тоже удалось получить вывод, но почему-то он не отличается от вывода в релизе, видимо санитайзер не умеет показывать место в коде, где произошла ошибка, только функцию. Но всё равно интересная штука.


Вы что-то на него наговариваете, у него очень подробный вывод
вплоть до переменных, например:

int main() {
        int arr[5];
        arr[5] = 17;
        return 0;
}


Как видите и строчки кода показывает и даже имя переменной:
==28730==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffdfbf6e3b4 at pc 0x00472c2e3a15 bp 0x7ffdfbf6e370 sp 0x7ffdfbf6e360
WRITE of size 4 at 0x7ffdfbf6e3b4 thread T0
    #0 0x472c2e3a14 in main /tmp/a.c:3
    #1 0x7f2f88ce44c9 in __libc_start_main (/usr/lib/libc.so.6+0x204c9)
    #2 0x472c2e3859 in _start (/tmp/a.out+0x859)

Address 0x7ffdfbf6e3b4 is located in stack of thread T0 at offset 52 in frame
    #0 0x472c2e3949 in main /tmp/a.c:1

  This frame has 1 object(s):
    [32, 52) 'arr' <== Memory access at offset 52 overflows this variable


К>>В Qt в pro файлы добавил:

К>>
К>>QMAKE_CFLAGS += -fsanitize=address
К>>QMAKE_LFLAGS += -fsanitize=address
К>>


Вроде бы правильный вариант это через CONFIG,
поддержка sanitizer интегрирована в Qt:

CONFIG += sanitizer sanitize_address


но я сам использую cmake, поэтому "за что купил, за то продал"
Re[8]: Разрушился стек в приложении на Qt
От: Zhendos  
Дата: 18.08.17 08:35
Оценка:
Здравствуйте, Кузнец, Вы писали:

К>А memory sanitizer что-то не получается подключить, задал флаги Qt:


К>
К>QMAKE_CXXFLAGS += -fsanitize=memory
К>QMAKE_LFLAGS += -fsanitize=memory

К>QMAKE_CXXFLAGS += -fPIE
К>QMAKE_LFLAGS += -fPIE

К>QMAKE_CXXFLAGS += -pie
К>QMAKE_LFLAGS += -pie
К>


К>и получил ошибку:


К>
К>error: unrecognized argument to -fsanitize= option: 'memory'
К>


Ну clang и gcc все-таки разные компиляторы, поэтому хотя команда Google
и работала над внедрением sanitizer для обоих компиляторов, но интерфейс
не точно соотвествует, -fsanitize=memory это только для clang,
точный список опций можно посмотреть в man gcc
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.