나는 -O3 -x c -std=c99 -fno-builtin -nostdlib -ffreestanding
gcc가 재귀 호출을하고 있습니까?
unsigned char *memset(unsigned char *dest, unsigned char val, int count)
{
unsigned char* p = dest;
while (count--)
*p++ = val;
return dest;
}
#include <stdio.h>
int main()
{
unsigned char c[20];
memset(c, 'a', 19);
c[19] = '\0';
printf((const char*) c);
}
이 코드를 컴파일하고 memset
GCC 어셈블리 출력에 호출 무엇 검사 godbolt을 사용하고 있습니다. 플래그와
memset:
test edx, edx
je .L6
sub edx, 1
sub rsp, 8
movzx esi, sil
add rdx, 1
call memset
add rsp, 8
ret
.L6:
mov rax, rdi
ret
main:
sub rsp, 40
movabs rax, 7016996765293437281
mov QWORD PTR [rsp], rax
mov QWORD PTR [rsp+8], rax
mov eax, 24929
mov WORD PTR [rsp+16], ax
mov rdi, rsp
xor eax, eax
mov BYTE PTR [rsp+18], 97
mov BYTE PTR [rsp+19], 0
call printf
add rsp, 40
ret
은 내가 GCC는
*p++ = val;
에서 재귀 호출을하고있다처럼 내장
memset
과 색상 화 godbolt 사용에서 판단 보이는 통화 그것의 모든 가능성을 제거하려고 시도하고있어 사용. 그래서 그것은 재귀 또는 내장 호출을하고 있습니까
memset
?
gdb를 사용하여 어떤 memset이 호출 중인지 확인할 수 있습니까? –
함수의 이름을 변경하고'memset' (내장 함수를 의미) 또는 새로운 이름을 호출하는지 확인하십시오. – interjay
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56888 –