@majstar_Zubr
C++, C#, gamedev

Как прочесть аргументы функции на стеке / заставить gcc хранить аргументы функции на стеке?

Пробовал __attribute__(__cdecl__) и CMAKE_C_FLAGS " -O0 " не помогли.

void foo (char arg1, int arg2, ... );

В точке вызова foo ('a', 5, 'b', 39, 'c', 46, 'd', 55)
определение

void __attribute__((__cdecl__)) SumIntDouble(char type_code, int arg, ...) {

      printf("VIEW: %c\n", *(&type_code + 0));
      printf("VIEW: %c\n", *(&type_code + 1));
      printf("VIEW: %c\n", *(&type_code + 2));
      printf("VIEW: %c\n", *(&type_code + 3));
      printf("VIEW: %c\n", *(&type_code + 4));
      printf("VIEW: %c\n", *(&type_code + 5));
      printf("VIEW: %c\n", *(&type_code + 6));


К адресу первого аргумента добавлял и отнимал 1 в цикле, не видел, чтобы b и c и др. лежали как предполагалось бы, если бы все аргументы ровно рядом лежали бы на стеке.

Смотрел на флаги компилятора, какие-то пробовал, но ни к чему это не привело.

Помогите, пожалуйста, разобраться

cmakelists:

cmake_minimum_required(VERSION 3.5)
project(playgraound_c_lang LANGUAGES C)
set( CMAKE_C_FLAGS " --no-stack-protector -O0 " )
add_executable(playgraound_c_lang main.c)
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
https://godbolt.org/z/ARYhis
Если посмотреть в пролог функции, она делает локальную копию нашей a. А желаемое место в стеке на 36 байтов выше, чем вы ищете.
Разумеется, всё под x86. Вызов под x64 подразумевает регистры.

UPD. А вот Интел не делает локальных копий и всё на месте.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@marsianin
Для этого есть средства стандатрной библиотеки. Смотрите сюда: https://en.cppreference.com/w/cpp/utility/variadic...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы