12.3.1. 简单的 C 程序(gcc)

一个简单的例子 “example.c” 可以通过如下方式和 “libm” 库一起编译为可执行程序 “run_example”。

  1. $ cat > example.c << EOF
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <string.h>
  5. int main(int argc, char **argv, char **envp){
  6. double x;
  7. char y[11];
  8. x=sqrt(argc+7.5);
  9. strncpy(y, argv[0], 10); /* prevent buffer overflow */
  10. y[10] = '\0'; /* fill to make sure string ends with '\0' */
  11. printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]);
  12. return 0;
  13. }
  14. EOF
  15. $ gcc -Wall -g -o run_example example.c -lm
  16. $ ./run_example
  17. 1, 2.915, ./run_exam, (null)
  18. $ ./run_example 1234567890qwerty
  19. 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) 来替代.