12.3.1. 简单的 C 程序(gcc)
一个简单的例子 “example.c
” 可以通过如下方式和 “libm
” 库一起编译为可执行程序 “run_example
”。
$ cat > example.c << EOF
#include <stdio.h>
#include <math.h>
#include <string.h>
int main(int argc, char **argv, char **envp){
double x;
char y[11];
x=sqrt(argc+7.5);
strncpy(y, argv[0], 10); /* prevent buffer overflow */
y[10] = '\0'; /* fill to make sure string ends with '\0' */
printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]);
return 0;
}
EOF
$ gcc -Wall -g -o run_example example.c -lm
$ ./run_example
1, 2.915, ./run_exam, (null)
$ ./run_example 1234567890qwerty
2, 3.082, ./run_exam, 1234567890qwerty
为了使用 sqrt(3),必须使用 “-lm
” 链接来自 libc6
软件包的库 “/usr/lib/libm.so
”。实际的库文件位于 “/lib/
”,文件名为 “libm.so.6
”,它是指向 “libm-2.7.so
” 的一个链接。
请看一下输出文本的最后一段。即使指定了 “%10s
”,它依旧超出了 10 个字符。
使用没有边界检查的指针内存操作函数,比如 sprintf(3) 和 strcpy(3), 是不建议使用,是为防止缓存溢出泄露而导致上面的溢出问题。请使用 snprintf(3) 和 strncpy(3) 来替代.