字符串没有宽度限制的最大危害是容易被缓冲区攻击。
以下代码中 sscanf 会报 "没有字段宽度限制的sscanf()可能会在输入大量数据时崩溃。" 错误。
double get_ram() {
FILE *file_fd = NULL;
Memory_t memory;
char buf[1024]{0};
file_fd = ::fopen("/proc/meminfo", "r");
if (file_fd == NULL) {
::perror("fopen /proc/meminfo error");
return 0;
}
::fgets(buf, sizeof(buf), file_fd);
::sscanf(buf, "%s %ld ", memory.name, &memory.total);
::fgets(buf, sizeof(buf), file_fd);
::sscanf(buf, "%s %ld ", memory.name2, &memory.free);
::fgets(buf, sizeof(buf), file_fd);
::sscanf(buf, "%s %ld ", memory.name3, &memory.available);
::fclose(file_fd);
file_fd = NULL;
return (double)(100.0 * (memory.total - memory.available)) / (memory.total);
}
加宽度限制即可,修改如下:
double get_ram() {
FILE *file_fd = NULL;
Memory_t memory;
char buf[1024]{0};
file_fd = ::fopen("/proc/meminfo", "r");
if (file_fd == NULL) {
::perror("fopen /proc/meminfo error");
return 0;
}
::fgets(buf, sizeof(buf), file_fd);
::sscanf(buf, "%24[^-] %ld ", memory.name, &memory.total);
::fgets(buf, sizeof(buf), file_fd);
::sscanf(buf, "%24[^-] %ld ", memory.name2, &memory.free);
::fgets(buf, sizeof(buf), file_fd);
::sscanf(buf, "%24s %ld ", memory.name3, &memory.available);
::fclose(file_fd);
file_fd = NULL;
return (double)(100.0 * (memory.total - memory.available)) / (memory.total);
}
主要是%s要加宽度限制,%24[^-]或%24s。