C语言改错题
1、指出错误并****改正****:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
enum { MAX_ALLOCATION = 1000 };
int main(int argc, const char *argv[]) {
char *c_str = NULL;
size_t len;
if (argc == 2) {
len = strlen(argv[1]) + 1;
if (len > MAX_ALLOCATION) {
/* Handle error */
}
c_str = (char *)malloc(len);
if (c_str == NULL) {
/* Handle error */
}
strcpy(c_str, argv[1]);
} else {
c_str = “usage: $>a.exe [string]”;
printf("%s\n", c_str);
}
free(c_str);****有条件申请,无条件释放****
return 0;
}
2、已知Linux下snprintf函数存在内存重叠的问题, 比如 snprintf(chStr, MAX_STRLEN, “%s%s”, “[TEST]”, chStr); 并不能实现实现字符串连接。如下函数试图解决这一问题,找出如下函数的错误和隐患并修改。
int snprintf_s(char *dst, size_t max_length, char *format, …)
{
va_list ap;
char *buf = NULL;
int len = 0;
if (NULL == dst || NULL == format) // -----------------入参保护
{
return -1;
}
va_start(ap, format);
buf = (char *)malloc(max_length);
if (NULL == buf ) // -----------------malloc返回值保护
{
return -1;
}
len = vsnprintf(buf, max_length, format, ap);
strncpy(dst, buf, len);
strncpy(dst, buf, max_length); // -----------------vsnprintf可能返回负值,或者较短的长度只拷贝了部分,会有残留,功能不能实现
buf[dst-1] = ‘\0’; // -----------------结束符保护
free(buf); // -----------------资源释放
va_end(ap);
return len;
}
3、指出错误并****改正****:
#define DBPRO_FIRSTTAG (UINT16)0xF100
#define MaxUpdateUserCount 256
BOOL rcsOptRegSetUserInfoSuccFlag(UINT16 TagValue, RegMsgInfo_T *msgInfo)
{
if ((TagValue - DBPRO_FIRSTTAG) >= MaxUpdateUserCount || NULL == msgInfo)减法溢出:TagValue >= MaxUpdateUserCount + DBPRO_FIRSTTAG
{
rcsRegLog(IMS_ERROR, "Invalid Tag, "
“