-
Notifications
You must be signed in to change notification settings - Fork 748
Quiet compiler warnings for registry.exe #1858
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Conversation
Registry does not segfault on V3.9.1.1 Some of these fixes should be necessary in general. I have no idea how they aren't causing problems everywhere. em_scm_xy executes without errors, but also without doing more than initialization (no successful completion message).
I don't feel like seeing notifications that I'm not paying attention to files I haven't touched.
Mostly from -Wsign-compare, -Wformat-truncation, and -Wformat-overflow; some from -Wmaybe-uninitialized.
This should get things to work somewhat reliably with how I set up Cygwin. It may not need the repeated -lstuff options on Linux systems, but it does on anything with a Windows linker model.
It tries to link with a library it didn't build. This does not work terribly well.
I looked up system functions for copy, but those seem to be unique to C++17. Removing a file might be done with unlink(), but I don't know the C API that well, so copying what I did for posix_spawn() it is.
@DWesl It looks like the compilation is failed for all of the tests. Our regression tests are run using gfortran compiler. Here is a particular error (also see the attached file): make[2]: Entering directory '/wrf/WRF/tools' |
Interesting. My own tests all used GFortran, so it's likely a Cygwin/Linux difference rather than a compiler one. I set up guards so the |
OK, now our regression tests have passed:
|
As have mine on Cygwin (with #1812) |
Am I missing anything for this PR? |
@islas Are any of the changes proposed here in conflict with anything you've been working on? |
@weiwangncar Nope, no conflicts should arise from our respective changes in registry |
@islas Great! Should we consider this in develop or for 4.5.2? |
I'd say this would be a nice-to-have if we can get it in, but not critical. |
@islas Thanks. We can leave it on the develop branch. |
tools/gen_irr_diag.c
Outdated
strcat( line,piece ); | ||
} | ||
strcat( line," /)\n" ); | ||
fprintf( fp_inc,line ); | ||
fprintf( fp_inc," \n"); | ||
|
||
for( i = 0; i < nChmOpts,rxt_cnt[i] > 0; i++ ) { | ||
for( i = 0; /*i < nChmOpts &&*/ rxt_cnt[i] > 0; i++ ) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems like this is relying on rxt_cnt
to be default initialized to zero. I'm not too sure what it is used for, but given that all other loops use nChmOpts
to specify number of indices into rxt_cnt
, keeping this check seems prudent
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The old version was ignoring the result of the nChmOpts
comparison. Are you suggesting that check be included in the for-loop exit condition?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah! You're correct, I forgot that this use of the ,
operator is nulling and not &&
I'd imagine that the original intent was to have it included via &&
given the other loops. Maybe @weiwangncar or someone else with historic knowledge on this section of the Registry can chime in. Otherwise, as long as tests agree, I think that check should be there
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changed to the suggested form. I'd still like to get an opinion from someone who knows this bit of the code better than me.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few magic constants I didn't catch earlier, plus some possibly-premature optimizations.
|
||
if ( p->ntl > 1 ) { sprintf(tag,"_2") ; sprintf(tag2,"_%d", use_nest_time_level) ; } | ||
else { sprintf(tag,"") ; sprintf(tag2,"") ; } | ||
else { tag[0] = '\0'; tag2[0] = '\0'; } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sprintf
will likely be clearer, and the compiler may notice this optimization anyway.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Alternately, strcpy
/strncpy
@@ -200,7 +200,7 @@ gen_nest_interp1 ( FILE * fp , node_t * node, char * fourdname, int down_path , | |||
if ( nest_mask & down_path ) | |||
{ | |||
if ( p->ntl > 1 ) { sprintf(tag,"_2") ; sprintf(tag2,"_%d", use_nest_time_level) ; } | |||
else { sprintf(tag,"") ; sprintf(tag2,"") ; } | |||
else { tag[0] = '\0'; tag2[0] = '\0'; } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sprintf
or strcpy
will likely be clearer, and the compiler might notice this optimization anyway.
@@ -130,7 +130,7 @@ else if ( down_path[ipath] == FORCE_DOWN ) { sprintf(halo_id,"HALO_FORCE_DOWN") | |||
else if ( down_path[ipath] == INTERP_UP ) { sprintf(halo_id,"HALO_INTERP_UP") ; } | |||
else if ( down_path[ipath] == SMOOTH_UP ) { sprintf(halo_id,"HALO_INTERP_SMOOTH") ; } | |||
sprintf(halo_define,"80:") ; | |||
sprintf(halo_use,"") ; | |||
halo_use[0] = '\0' ; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sprintf
may be clearer, and the compiler may still notice the optimization.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Or strcpy
, since this isn't using any of the formatting features.
tools/reg_parse.c
Outdated
@@ -256,7 +275,7 @@ pre_parse( char * dir, FILE * infile, FILE * outfile ) | |||
if ( !strcmp( tokens[F_USE] , tracers[i] ) ) found = 1 ; | |||
} | |||
if ( found == 0 ) { | |||
sprintf(tracers[ntracers],tokens[F_USE]) ; | |||
snprintf(tracers[ntracers], 100, tokens[F_USE]) ; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Definition on line 89; should this be another magic constant?
#else | ||
#endif | ||
# include <sys/time.h> | ||
# include <sys/resource.h> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I suspect these two headers are still unavailable on Windows; the others might be.
@@ -1,6 +1,12 @@ | |||
#ifndef REGISTRY_H | |||
#include <stdlib.h> | |||
#include <ctype.h> | |||
#include <sys/unistd.h> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This might also be unavailable on Windows.
@@ -157,7 +159,8 @@ main( int argc, char *argv[], char *env[] ) | |||
sprintf( fname_wrk,"%s/Registry_irr_diag",dir ) ; | |||
} | |||
// fprintf(stderr,"Registry tmp file = %s\n",fname_wrk); | |||
sprintf(command,"/bin/cp %s %s\n",fname_in,fname_wrk); | |||
/* we should be able to implement this using posix_spawn */ | |||
sprintf(command,"/bin/cp \'%s\' \'%s\'\n",fname_in,fname_wrk); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This will still break if the filename includes apostrophes, but I think that's unlikely enough to not try re-implementing Python's shlex.quote
.
@DWesl The compilation failed in our regression test. If you need to see the output, let me know. |
The regression test results from the last commit:
|
@islas Is this ready for approval? |
Change compile flags back to what they were before.
Guard io.h #include to avoid Linux compilation failures.
Given how much space this provides at the moment, this had better not run over.
Most likely the better solution is to look up functions to copy or delete files directly. I'm not sure where to look for those, but I'm pretty sure they're not in the C standard.
I pushed it to another branch, so a PR version can get some eyes on it.
external/RSL_LITE implements these as int, so they need to be declared with int returns, not void.
Not quite all of them yet, but there's only one other, that one without an existing named constant. EDIT: There's about seventy left: I'll have to go through those again.
I think there's a way to pass this as a parameter to snprintf instead, but I don't remember what that is at the moment.
I looked up how to do this. Apparently you just stick a star for the width and put the variable with the width before the variable you want to have that width.
grep -E -e '\[[[:digit:]]{2,}\]' *.[CcHhFf]*
1d09961
to
4ba1aab
Compare
Lots of unused variables, but I should be able to leave those for a bit. Unused parameters would be a pain, so I'm leaving those.
I split off the remaining Cygwin-specific fixes to DWesl#5. This should be just the bits that address warnings, with comments on the bits I thought might be controversial. |
I wanted to make it a short to save space in the strings based on this, but given the push to optimize for clarity that's less relevant.
@DWesl This PR has code conflicts with what is in the latest repository. Can you resolve these conflicts while preserving the latest change in the repository? |
There's a number of places that change |
Apparently that's #1942, which also attempted to fix warnings, in this case a warning that The other option would be to just delete the conditional, but the comment implies there's a point to it. I just asked on that PR for clarification of what I should do with those cases. |
…warnings-registry Fix merge conflicts.
I made nChmOpts a short int to keep buffer size down. Given the change to named constants, this is likely irrelevant. On the other hand, it may currently max out at five.
Discussion resolved there, conflicts resolved here: I kept the bit-mask then logical-not I already had. |
Should I try to squash the changes into fewer commits? |
@islas Can you see if this PR can be accepted? |
I need to check locally to see if there's been more warnings in the past year or two |
Might be warnings in the rest of the code, and I might need to increase the stack size again, but it compiles without error.
Quiet the compiler warnings in registry.exe
TYPE: bug fix
KEYWORDS: compiler warnings, snprintf, initial values, string length
SOURCE: "Daniel Wesloh (Pennsylvania State University Department of Meteorology and Atmospheric Science)"
DESCRIPTION OF CHANGES:
Problem:
Generally or specifically, what was wrong and needed to be addressed?
A few years ago,
registry.exe
was segfaulting while compiling WRF. I enabled every compiler warning for that build process I could find, and tried to fix every one I saw. The problem ended up being insufficient stack space (fix merged a few years ago), but fixing the warnings probably won't hurt.Solution:
What was down algorithmically and in the source code to address the problem?
short
instead ofint
for numbers in the 300--16,000 range, so printf knows that five characters will be enough)snprintf
and friendsISSUE: None
LIST OF MODIFIED FILES: list of changed files
TESTS CONDUCTED:
RELEASE NOTE: Eliminate some compiler warnings when building registry.exe