C 此代码是否包含未定义的行为或隐藏的bug?我错过了什么?
这是一段测试名为“logf”的函数的代码,该函数接受两个参数并使用它们记录一些信息。在本例中,函数的第一个参数是要记录的字符串,第二个参数是保存文件系统中指向日志文件的路径的字符串。第一个字符串连同时间戳一起打印到标准输出和日志文件C 此代码是否包含未定义的行为或隐藏的bug?我错过了什么?,c,ansi,C,Ansi,这是一段测试名为“logf”的函数的代码,该函数接受两个参数并使用它们记录一些信息。在本例中,函数的第一个参数是要记录的字符串,第二个参数是保存文件系统中指向日志文件的路径的字符串。第一个字符串连同时间戳一起打印到标准输出和日志文件 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #define EXIT_SUCCESS 0 #define
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
typedef struct tm tm;
int logf(char input_string[], char log_file_string[])
{
/*Initializations.*/
char output_string[32767];
FILE* log_file_stream;
time_t current_time_epoch_format;
tm* current_time_calandar_format;
/*Creating timestamp in output string, amending first argument to output string, and logging.*/
if ((strlen(input_string) + 23) > 32767) return EXIT_FAILURE;
if ((current_time_epoch_format = time(¤t_time_epoch_format)) == -1) return EXIT_FAILURE;
if ((current_time_calandar_format = localtime(¤t_time_epoch_format)) == NULL) return EXIT_FAILURE;
if (strftime(output_string, 23, "[%d-%m-%Y %H:%M:%S] ", current_time_calandar_format) != 22) return EXIT_FAILURE;
if ((log_file_stream = fopen(log_file_string, "a")) == NULL) return EXIT_FAILURE;
if (printf("%s\n", strcat(output_string, input_string)) < 1) return EXIT_FAILURE;
if (fprintf(log_file_stream, "%s\n", output_string) < 1) return EXIT_FAILURE;
if (fclose(log_file_stream) == EOF) return EXIT_FAILURE;
return EXIT_SUCCESS;
}
int main(int argc, char** argv)
{
/*Initializations.*/
int EXIT_CODE;
/*Print the returned integer from logf and exit.*/
printf("%d\n", (EXIT_CODE = logf(argv[1], argv[2])));
exit(EXIT_CODE);
}
此程序调用未定义的行为,因为名称logf保留供外部使用。它是一个标准数学函数的名称。它是否也因为其他原因调用了未定义的行为,我还没有检查。这可能属于?谢谢你的链接。t_t32k阵列-目标是什么?在嵌入式系统上,这可能是一个问题。请注意,只要在printf%s\n、strcatoutput\u string、input\u string中使用该数组,则该数组只需要23个字节的长度。只需使用printf%s\n、input_string@William莫里斯:时间戳呢?是否应使用printf%s%s\n、output\u string、input\u string?请注意,如果在logf中打开文件后但在关闭之前出现问题,则代码会泄漏打开的文件。这是可以避免的,也是最好避免的。中定义了退出失败和退出成功;没有必要重新定义它们。