- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我的程序在 gdb 中反汇编时,我可以看到 buf 的地址被压入堆栈,但我没有看到格式字符串被压入它。这是什么原因?是不是巧妙的编译器优化?
我尝试编译一些不同的 printf 语句变体,看看我是否可以模仿没有被压入堆栈的“%s”字符串(或它的地址),但我做不到。
这是程序代码:
int main(int argc, char **argv) {
char buf[128];
if(argc < 2) return 1;
strcpy(buf, argv[1]);
printf("%s\n", buf);
return 0;
}
用 gcc 4.5.2 编译,32 位 linux
最佳答案
是的,gcc 似乎会丢弃 "printf ("%s\n", buff)"并用 "puts()"代替它:
vi tmp.c =>
#include <stdio.h>
#include <string.h>
int
main(int argc, char **argv)
{
char buf[128];
if(argc < 2)
return 1;
strcpy(buf, argv[1]);
printf("%s\n", buf);
return 0;
}
$ gcc -S -Wall -pedantic tmp.c less tmp.s =>
.file "tmp.c"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $148, %esp
movl %ecx, -140(%ebp)
movl -140(%ebp), %eax
cmpl $1, (%eax)
jg .L2
movl $1, -136(%ebp)
jmp .L4
.L2:
movl -140(%ebp), %edx
movl 4(%edx), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, 4(%esp)
leal -132(%ebp), %eax
movl %eax, (%esp)
call strcpy
leal -132(%ebp), %eax
movl %eax, (%esp)
call puts
movl $0, -136(%ebp)
.L4:
movl -136(%ebp), %eax
addl $148, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-48)"
.section .note.GNU-stack,"",@progbits
关于gcc - printf 编译器优化?在堆栈上的 gdb 中找不到 "%s"个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8454106/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!