What's new
Runion

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

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

X-Shar сказал(а):
Переполнение стека ещё.

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

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

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

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

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

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

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

header1.h:
Код: Скопировать в буфер обмена
Code:
struct a {
 int val1;
 int val2;
}

header2.h::
C: Скопировать в буфер обмена
Code:
struct a {
 int val1;
 int val11
 int val2;
}

example1:
Код: Скопировать в буфер обмена
Code:
#include "header1.h"

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

example2:
Код: Скопировать в буфер обмена
Code:
#include "header2.h"

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

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

Вот такие приколы, когда компилятор удаляет части нужного кода и из-за этого тоже возникают всякие весёлые моменты и долгое кувыркание для отладки.)))
Нажмите, чтобы раскрыть...
Ясно. Раз такое, то структуры, если они различны по строению, надо было обзывать по разному или использовать union в структуре для не обязательного элемента. Если не ошибаюсь.
К примеру:
C: Скопировать в буфер обмена
Code:
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. По крайней мере, у меня никогда таких проблем не было, честно. В противном случае, компилятор просто отказывался собирать и все.
 
Larry сказал(а):
P.S. По крайней мере, у меня никогда таких проблем не было, честно. В противном случае, компилятор просто отказывался собирать и все.
Нажмите, чтобы раскрыть...
Ну я тоже первый раз такое словил.)

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

#include <../comands.h>

 });

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

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

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

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

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

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



А если использовать секьюрные функи с постфиксом _s, то код вообще не скомпилится, но это вы и сами думаю знаете.
 
Никто не будет отказываться от С\С++. Существует огромное количество программных продуктов в которые влиты огромные бабки, а это бизнес. Так или иначе в эту секунду пилится новый софт на С\С++ или обновляется\расширяется существующий. Никто не будет заниматься херней и переписывать гиганскую кодовую базу с одного яп на другой. Это проблема не самого языка. Это проблема старого и нового поколения программистов.
 
weaver сказал(а):
в эту секунду пилится новый софт на С\С+
Нажмите, чтобы раскрыть...
  • Каждую секунду в мире
    ковыряются в носу 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, будут искать подходы точно также. Просто сейчас он не в фокусе, и о его безопасности никто не говорит.
 
Top