• XSS.stack #1 – первый литературный журнал от юзеров форума

АНБ призывает IT-компании отказываться от C и C++

Переполнение стека ещё.

Да что угодно может-быть...)

Вот у меня недавно из-за головотяпства было, есть два заголовочных файла, в каждом из этих заголовочных файлов определена структура, но отличие в этой структуре в том-что там разное расположение элементов и размер структуры тоже разный.

Вот и смотрите в одном модуле, где заинклуден один заголовочник я объявляю эту структуру, что-то с ней делаю и передаю указатель на структуру в другой модуль, где заинклуден второй заголовочник и то-же что-то с ней делаю, в итоге ловлю неопределенное поведение, в рамках своей программы.)
Хм... Ну переполнение стека, это понятно, но тут надо постараться :cool:. Но в отличии от того же хипа, размер стека определен опционально в PE заголовке и его, в отличии от памяти резервируемой в хипе не нужно освобождать.

По поводу структуры. Обе структуры имеют одно и то же название? Вообще-то компилятор, по хорошему, должен был заматерится, что структура переопределена и не дать собрать. По крайне мере, у меня так. Возможно у вас какие-то варнинги отключены? Хотя, это считается критичной ошибкой.
Интересно, как компилятор выставил приоритет, какое из двух объявлений структур выбрать для сборки? Странно все это :confused:
 
Возможно у вас какие-то варнинги отключены?
Да ворнинги были подавлены, не спрашивайте почему, есть на это причина.)

Да, я это не под винду делал, вообще в рамках этого обсуждения мы-же говорим не только за какие-то прикладные приложения...)

Поэтому, как я уже писал, но повторюсь, что возможно всё-что угодно, в зависимости от задачи.
 
Интересно, как компилятор выставил приоритет, какое из двух объявлений структур выбрать для сборки? Странно все это
Ну определение одно.

Просто при передачи в другой модуль использовались другие смещения адресов и размеры.)
 
Ну вот пример:

header1.h:
Код:
struct a {
    int val1;
    int val2;
}

header2.h::
C:
struct a {
    int val1;
    int val11
    int val2;
}

example1:
Код:
#include "header1.h"

void test (void)
{
    struct a A;
    //тут что-то делаем со структурой и передаём указатель в badfunction которая определена в модуле example2
    badfunction(&A);
}

example2:
Код:
#include "header2.h"

void badfunction (struct a* badStruct)
{
   //Тут будет переполнение
   memset(badStruct, sizeof(struct a));
}
 
Ещё есть такая штука, как оптимизация компилятора.)

Вот такие приколы, когда компилятор удаляет части нужного кода и из-за этого тоже возникают всякие весёлые моменты и долгое кувыркание для отладки.)))
 
Ещё есть такая штука, как оптимизация компилятора.)

Вот такие приколы, когда компилятор удаляет части нужного кода и из-за этого тоже возникают всякие весёлые моменты и долгое кувыркание для отладки.)))
Ясно. Раз такое, то структуры, если они различны по строению, надо было обзывать по разному или использовать union в структуре для не обязательного элемента. Если не ошибаюсь.
К примеру:
C:
typedef struct _KEY_EVENT_RECORD {
  BOOL  bKeyDown;
  WORD  wRepeatCount;
  WORD  wVirtualKeyCode;
  WORD  wVirtualScanCode;
  union {
    WCHAR UnicodeChar;
    CHAR  AsciiChar;
  } uChar;
  DWORD dwControlKeyState;
} KEY_EVENT_RECORD;

В зависимости от того, обращаемся мы UnicodeChar или AsciiChar, размерность структуры будет разная.
Но обычно, выравнивание структуры, в х86 (к примеру), по умолчанию на 4 байта (DWORD).
Т.е. структура должна быть выровнена опираясь на элемент UnicodeChar с размером WCHAR, даже если вы используете AsciiChar.
Может чушь сморозил ;)

P.S. По крайней мере, у меня никогда таких проблем не было, честно. В противном случае, компилятор просто отказывался собирать и все.
 
Последнее редактирование:
P.S. По крайней мере, у меня никогда таких проблем не было, честно. В противном случае, компилятор просто отказывался собирать и все.
Ну я тоже первый раз такое словил.)

Скажу честно портировал код от Китайцев, код от Дядюшки Мяо отличается особым подходом, да там много всяких приколов у Китайцев и автогенерируемый код и инклуды всякие прикольные, типо такого:
Код:
static const auto pValue = std::make_unique<ptr1, ptr2>({

#include <../comands.h>

    });

Названия поменял, но смысл такой, что в comands.h массив из около 500 строк, где указатели на функции...

Короче я очень полюбил Китайцев.)))

Я тоже использую сомнительные подходы, но Китайцы переплюнули меня в сотню раз.)
 
Названия поменял, но смысл такой, что в comands.h массив из около 500 строк, где указатели на функции...
Это типа COM интефейса, если указатели?
Я тоже использую сомнительные подходы, но Китайцы переплюнули меня в сотню раз.)
Я думал индусов не переплюнуть... а тут китайцы опередили :cool:
 
Это типа COM интефейса, если указатели?
Указатели на функции.

Там массив из двух элементов был, номер события и второй элемент указатель на функцию.

Ну т.е. в зависимости от события, должна-была вызваться нужная функция.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Самое частое, особенно в работе с хипом, это выход за пределы выделяемой памяти (размер данных, помещаемых в память больше выделенной, что приводит к повреждению хипа)
FORTIFY_SOURCE и Address Sanitizer может предупреждать большую часть таких проблем. В 2022 году люди до сих пор в нотпадах кодят, вырубают варнинги, сидят на древних компиляторах, а потом удивляются багам хотя встроенных инструментов анализа уже хватает. В ядре с повреждением хипа/пула все проще, драйвер бсоднется из-за нарушения целостности хедера следующего чанка (BAD_POOL_HEADER) или с page fault (PAGE_FAULT_IN_NONPAGED_AREA). С утечками конечно дело обстоит сложнее.

По поводу варнингов довольно простой пример, но тем не менее.

pooloverflow.png


А если использовать секьюрные функи с постфиксом _s, то код вообще не скомпилится, но это вы и сами думаю знаете.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Никто не будет отказываться от С\С++. Существует огромное количество программных продуктов в которые влиты огромные бабки, а это бизнес. Так или иначе в эту секунду пилится новый софт на С\С++ или обновляется\расширяется существующий. Никто не будет заниматься херней и переписывать гиганскую кодовую базу с одного яп на другой. Это проблема не самого языка. Это проблема старого и нового поколения программистов.
 
в эту секунду пилится новый софт на С\С+
  • Каждую секунду в мире
    ковыряются в носу 179 миллионов 589 человек одновременно
  • каждые 15 секунд в мире
    происходит сбой жесткого диска персонального компьютера
  • Каждые 5 секунд в мире
    происходит пожар.
  • Каждую секунду в мире
    происходит около 9000 сбоев электропитания
  • Каждую секунду 1 % населения
    Земли мертвецки пьян
  • Каждую секунду в мире выпивают
    14 чашек чая, в год, стало быть, 700 миллиардов чашек!
  • Каждые 40 секунд в мире
    происходит самоубийство
  • 2 пары в секунду
    занимаются сексом, только для зачатия ребенка.
  • Каждую секунду в мире рождается
    три ребенка, происходит 10 зачатий, 15 тысяч оргазмов открываются 4000
    банок консервов,
  • Каждую секунду в мире
    отправляется до 200 тысяч СМС
  • Каждые 10 секунд угоняют
    1 автомобиль
  • Каждые 7 секунд с ума сходит 1
    человек,
  • Каждые 5 секунд слепнет 1
    человек,
  • Каждые 40 секунд совершается
    самоубийство,
  • Каждые 37 секунд -
    убийство,
  • Каждые 6 секунд умирает 1
    человек из-за курения,
  • Каждую секунду в мире рождается
    3 ребенка,
  • Каждые 5 секунд 1 ребенок
    умирает от голода…
  • Каждую секунду в мире рождается
    три ребенка
  • Происходит 10 зачатий,
  • 15 тысяч оргазмов
  • Открываются 4000 банок
    консервов
  • Именно в эту секунду вы читаете этот пост.
:t
 
Смешно конечно. Имхо, если просто поменять инструмент (язык в данном случае), то кто дает гарантий, что не будет никаких проблем? ) Сейчас все написано на C++, и хакеры изучает все подходы и тактики чтобы проэксплуатировать системы. А будет все написано на том же Rust, будут искать подходы точно также. Просто сейчас он не в фокусе, и о его безопасности никто не говорит.
 
Какая нахуй безопастность, с теми процессорными мощностями что мы имеем ни о каком повсеместном использовании оберток вокруг памяти не может быть и речи.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх