1
0
mirror of https://github.com/simh/simh.git synced 2026-01-26 20:12:23 +00:00

SCP: Add source code checking for SCP only APIs

This commit is contained in:
Mark Pizzolato
2023-05-19 16:59:01 -10:00
parent aa39867349
commit cfe25e5366

View File

@@ -2305,6 +2305,19 @@ static const char *_check_source_platform_defines[] = {
NULL NULL
}; };
static const char *_check_source_scp_only_apis[] = {
"sim_os_ms_sleep",
"sim_master_sock",
"sim_accept_conn",
"sim_accept_conn_ex",
"sim_connect_sock",
"sim_connect_sock_ex",
"sim_read_sock",
"sim_write_sock",
"sim_close_sock",
NULL
};
typedef struct FILE_STATS { typedef struct FILE_STATS {
char RelativePath[PATH_MAX + 1]; char RelativePath[PATH_MAX + 1];
t_offset FileSize; t_offset FileSize;
@@ -2326,6 +2339,8 @@ typedef struct FILE_STATS {
char **MissingIncludes; char **MissingIncludes;
int PlatformDefineCount; int PlatformDefineCount;
char **PlatformDefines; char **PlatformDefines;
int ScpAPICount;
char **ScpAPIs;
int LineEndingsLF; int LineEndingsLF;
int LineEndingsCRLF; int LineEndingsCRLF;
t_bool ProblemFile; t_bool ProblemFile;
@@ -2434,12 +2449,13 @@ if (Stats->IsSource) {
int startoffset = 0; int startoffset = 0;
int erroffset; int erroffset;
const char **platform_define; const char **platform_define;
const char **scp_api;
if (sim_sock_re == NULL) if (sim_sock_re == NULL)
sim_sock_re = pcre_compile ("\\#\\s*include\\s+\\\"sim_sock\\.h\"", 0, &errmsg, &erroffset, NULL); sim_sock_re = pcre_compile ("\\#\\s*include\\s+\\\"sim_sock\\.h\"", 0, &errmsg, &erroffset, NULL);
matches = 0; matches = 0;
while (1) { while (sim_sock_re != NULL) {
rc = pcre_exec (sim_sock_re, NULL, data, (int)FileSize, startoffset, PCRE_NOTBOL, ovec, 6); rc = pcre_exec (sim_sock_re, NULL, data, (int)FileSize, startoffset, PCRE_NOTBOL, ovec, 6);
if (rc == PCRE_ERROR_NOMATCH) if (rc == PCRE_ERROR_NOMATCH)
break; break;
@@ -2453,7 +2469,7 @@ if (Stats->IsSource) {
local_include_re = pcre_compile ("\\#\\s*include\\s+\\\"(.+)\\\"", 0, &errmsg, &erroffset, NULL); local_include_re = pcre_compile ("\\#\\s*include\\s+\\\"(.+)\\\"", 0, &errmsg, &erroffset, NULL);
matches = startoffset = 0; matches = startoffset = 0;
while (1) { while (local_include_re != NULL) {
char *local_include; char *local_include;
rc = pcre_exec (local_include_re, NULL, data, (int)FileSize, startoffset, PCRE_NOTBOL, ovec, 6); rc = pcre_exec (local_include_re, NULL, data, (int)FileSize, startoffset, PCRE_NOTBOL, ovec, 6);
@@ -2472,7 +2488,7 @@ if (Stats->IsSource) {
sys_include_re = pcre_compile ("\\#\\s*include\\s+\\<(.+)\\>", 0, &errmsg, &erroffset, NULL); sys_include_re = pcre_compile ("\\#\\s*include\\s+\\<(.+)\\>", 0, &errmsg, &erroffset, NULL);
matches = startoffset = 0; matches = startoffset = 0;
while (1) { while (sys_include_re != NULL) {
char *sys_include; char *sys_include;
t_bool benign_include = FALSE; t_bool benign_include = FALSE;
const char **allowed_include = _check_source_allowed_sysincludes; const char **allowed_include = _check_source_allowed_sysincludes;
@@ -2515,7 +2531,18 @@ if (Stats->IsSource) {
} }
} }
if ((!Stats->IsInScpDir) && (Stats->OtherSysIncludeCount != 0) && (Stats->PlatformDefineCount != 0)) for (scp_api = _check_source_scp_only_apis; *scp_api != NULL; ++scp_api) {
if (strstr (data, *scp_api) != NULL) {
++Stats->ScpAPICount;
Stats->ScpAPIs = (char **)realloc (Stats->ScpAPIs, Stats->ScpAPICount * sizeof (*Stats->ScpAPIs));
Stats->ScpAPIs[Stats->ScpAPICount - 1] = strdup (*scp_api);
}
}
if ((!Stats->IsInScpDir) &&
((Stats->OtherSysIncludeCount != 0) ||
(Stats->PlatformDefineCount != 0) ||
(Stats->ScpAPICount != 0)))
Stats->ProblemFile = TRUE; Stats->ProblemFile = TRUE;
} }
free (extension); free (extension);
@@ -2600,9 +2627,11 @@ for (i = 0; i < count; i++)
free (list); free (list);
} }
static void _sim_check_source_file_report (FILE_STATS *File, int maxnamelen) static void _sim_check_source_file_report (FILE_STATS *File, int maxnamelen, t_stat stat)
{ {
if ((sim_switches & SWMASK ('D')) || (File->ProblemFile)) { if ((sim_switches & SWMASK ('D')) || (File->ProblemFile) ||
((stat != SCPE_OK) &&
((File->HasSimSockInclude) || (File->BenignIncludeCount != 0)))) {
sim_printf ("%*.*s ", -maxnamelen, -maxnamelen, File->RelativePath); sim_printf ("%*.*s ", -maxnamelen, -maxnamelen, File->RelativePath);
sim_printf ("%8u bytes", (unsigned int)File->FileSize); sim_printf ("%8u bytes", (unsigned int)File->FileSize);
if (File->Lines) if (File->Lines)
@@ -2630,6 +2659,7 @@ if ((sim_switches & SWMASK ('D')) || (File->ProblemFile)) {
_check_source_print_string_list ("Other System Include Files", File->OtherSysIncludes, File->OtherSysIncludeCount); _check_source_print_string_list ("Other System Include Files", File->OtherSysIncludes, File->OtherSysIncludeCount);
_check_source_print_string_list ("Missing Include Files", File->MissingIncludes, File->MissingIncludeCount); _check_source_print_string_list ("Missing Include Files", File->MissingIncludes, File->MissingIncludeCount);
_check_source_print_string_list ("Platform Specific Defines", File->PlatformDefines, File->PlatformDefineCount); _check_source_print_string_list ("Platform Specific Defines", File->PlatformDefines, File->PlatformDefineCount);
_check_source_print_string_list ("SCP Private APIs", File->ScpAPIs, File->ScpAPICount);
} }
_check_source_free_string_list (File->BenignIncludes, File->BenignIncludeCount); _check_source_free_string_list (File->BenignIncludes, File->BenignIncludeCount);
_check_source_free_string_list (File->LocalIncludes, File->LocalIncludeCount); _check_source_free_string_list (File->LocalIncludes, File->LocalIncludeCount);
@@ -2637,6 +2667,7 @@ _check_source_free_string_list (File->SysIncludes, File->SysIncludeCount);
_check_source_free_string_list (File->OtherSysIncludes, File->OtherSysIncludeCount); _check_source_free_string_list (File->OtherSysIncludes, File->OtherSysIncludeCount);
_check_source_free_string_list (File->MissingIncludes, File->MissingIncludeCount); _check_source_free_string_list (File->MissingIncludes, File->MissingIncludeCount);
_check_source_free_string_list (File->PlatformDefines, File->PlatformDefineCount); _check_source_free_string_list (File->PlatformDefines, File->PlatformDefineCount);
_check_source_free_string_list (File->ScpAPIs, File->ScpAPICount);
free (File); free (File);
} }
@@ -2743,7 +2774,7 @@ if ((sim_check_scp_dir != NULL) &&
sim_check_scp_dir = NULL; sim_check_scp_dir = NULL;
} }
for (file = 0; file < Stats->FileCount; file++) for (file = 0; file < Stats->FileCount; file++)
_sim_check_source_file_report (Stats->Files[file], namelen); _sim_check_source_file_report (Stats->Files[file], namelen, stat);
if (Stats->ProblemFiles > 0) if (Stats->ProblemFiles > 0)
stat = SCPE_FMT; stat = SCPE_FMT;
free (Stats->Files); free (Stats->Files);