当我尝试编译使用gets()GCC函数的C代码时,
我明白了
警告:
(.text + 0x34):警告:`gets'函数很危险,不应该使用.
我记得这与堆栈保护和安全性有关,但我不确定为什么?
有人可以帮我删除这个警告并解释为什么会有这样的使用警告gets()?
如果gets()是如此危险,为什么我们不能删除它?
在errno.h,这个变量被声明为extern int errno;我的问题是,errno在一些调用之后检查值是否安全或在多线程代码中使用perror()是否安全.这是一个线程安全变量吗?如果没有,那么替代方案是什么?
我在x86架构上使用linux和gcc.
我在Linux内核代码中遇到了这两个宏.我知道它们是编译器(gcc)的指令,用于在分支的情况下进行优化.我的问题是,我们可以在用户空间代码中使用这些宏吗?它会进行任何优化吗?任何例子都会非常有用.
据对我来说,它是零,但似乎有一点混乱这里
我用gcc编译器对它进行了测试,它给出了零作为输出.我知道在C++中,空类的大小是1.如果我在这里遗漏任何东西,请告诉我.
我知道如果我在函数foo()中某处调用某个bar()函数,那么这个返回地址就会被推送到堆栈中.
#include <stdio.h>
void foo()
{
unsigned int x;
printf("inside foo %x\n", &x);
}
int main()
{
foo();
printf("in main\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,当foo函数处于活动状态时,我将获得堆栈上第一个推送的局部变量的地址.如何访问在堆栈上此变量之前某处推送的返回地址(主要称为foo)?该位置是固定的,可以相对于第一个局部变量访问吗?我怎么修改它?
编辑:我的环境是使用gcc编译器的x86处理器上的Ubuntu 9.04.
我知道堆栈大小是固定的.所以我们不能在堆栈上存储大对象,我们转向动态分配(例如malloc).此外,当存在函数调用嵌套时使用堆栈,因此我们也避免了递归函数.在运行时有没有办法确定到目前为止使用了多少堆栈内存以及剩下多少?
在这里,我假设使用x86架构的linux环境(gcc编译器).
在我的Ubuntu机器上,正在运行的默认内核映像是为smp(CONFIG_SMP=y)构建的.但这台机器只有1个CPU.
在单处理器内核上,与smp内核不同,spin_lock/unlock是空函数.那么这个设置的表现spin_lock()和spin_unlock()行为如何呢?
这种特定于smp的代码是否会对性能产生影响?
我在shell脚本中遇到了"$$"表达式,就像这样
TFILE=$$
谁能告诉我它的含义?
以下行打印输出为4,而我期待0.
printk(KERN_INFO "size of spinlock_t %d\n", sizeof(spinlock_t));
Run Code Online (Sandbox Code Playgroud)
我在一个单CPU的系统上试过这个.构建内核时没有启用调试标志CONFIG_DEBUG_SPINLOCK or CONFIG_DEBUG_LOCK_ALLOC.根据内核头文件,它应该为零,但输出与它不一致,任何猜测?