Fix oacr build warnings #68
No reviewers
Labels
No labels
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
gh-microsoft/ftl-sdk!68
Loading…
Reference in a new issue
No description provided.
Delete branch "fixoacrbuildwarnings"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fixed TVS oacr warnings that appear when built for console code.
Windows wants us to check buffer size, while this is not required on Linux, so two new defines added for memcpy_s and vsnprintf_s.
Also Windows suggest we use GetAddrInfoW which takes a windows wide string, this method does not work with Linux. So we will suppress the warning.
I believe you want something like strlen here, sizeof will return the size of the type which I think is char*, so 4 bytes.
@ -842,7 +842,7 @@ static int _media_send_slot(ftl_stream_configuration_private_t *ftl, nack_slot_tint pkt_len;This should be sizeof(pkt) * MAX_PACKET_BUFFER
Can you call strlen on a char[] ?
Of course, [] and * is the same in C anyway. (Both are a pointer, it is just syntactic sugar, really).
Also sizeof(char*) is 8 bytes on 64-bit :p
hmmm, but there should be a nice way to get the count
Yeah, strlen will look through the array until it finds a '/0'
I'm not much of a C guy (more of a C++ heathen), but I'd usually refer to the standard in such cases:
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf page 92, 6.5.3.4 3rd paragraph
And voila, like C++, C's arrays degrade into pointers when passed to a function that accepts pointers, but the sizeof operator actually returns the full size of the array.
The standard even gives you a neat example covering your use case g
Btw, according to wikipedia where it is linked, that is the "Final version of the C99 standard with corrigenda TC1, TC2, and TC3 included, formatted as a draft".
If that standardization process is anything like C++'s, that's about as close as you can get to the real standard without paying money :)
strlen now used in the next iteration.
thnkas guys for the tips, I've been living in c# world for a long time 😄
Just dropping in here, sorry for the confusion.
The type of m.msg.log.string is char[]. It's an allocated array in the struct and has a size. sizeof(char[]) is correct here and will give the number of bytes in the total array. strlen() is incorrect here as the array isn't yet initialized. It will just search through uninitialized memory until it happens to find a 0.
@TomyLobo I think you're misinterpreting the standard. Footnote 88 on page 80 under 6.5.3.4 explains how sizeof() applies to a parameter degraded array, which is that it returns the size of the pointer type, not the whole array.
Anyway, that doesn't apply here since m.msg.log.string isn't a function parameter.
There is however an issue with the second sizeof() parameter (the count parameter). You either need to subtract 1 to allow for the null terminator and add error handling code to check if vsnprintf_s failed to write the whole string, or since this is just for logging, you can just replace it with _TRUNCATE and let it automatically truncate the string.
I was confused about your page numbers there for a while.
Apparently, pdf page 92 is standard page 80 :)
Anyway, I actually have no idea what type the "string" field has. I assumed that, being a field it was not char[], but char[x] (which behave differently in sizeof, at least in C++)
So, what is it? char[] or char[x]?
Ah, sorry about the page confusion.
The "string" variable is a char[1024] in a struct which is in the msg union, which is in the m struct.
https://ideone.com/1YQUTV there we go
So this means that "m.msg.log.string" cannot actually be a char[], assuming this piece of code compiles in gcc 6.3 :)
This means it's likely char[x] and sizeof was correct.
If, however, it is char*, you cannot use sizeof. In that case, you need the size from somewhere else. If it's not initialized and you did not store the length somewhere alongside the pointer, good luck figuring out the length :)
Yup so seems like this is a char[x], so I'll move this back to sizeof.
And for the count we'll use the _TRUNCATE for string truncation.
Good call. Thanks everyone!
It looks like this doesn't build on Linux currently, can you take a look? Here are the build errors.
[ 38%] Building C object CMakeFiles/ftl.dir/libftl/logging.c.o
In file included from /var/lib/jenkins/workspace/tl-sdk_fixoacrbuildwarnings-4OYIR3M7N4Z4DCVGVF3LAQBGZZPEVQSZO7DAGCWVR4O427WAWWQA/ftl-sdk/libftl/logging.c:26:0:
/var/lib/jenkins/workspace/tl-sdk_fixoacrbuildwarnings-4OYIR3M7N4Z4DCVGVF3LAQBGZZPEVQSZO7DAGCWVR4O427WAWWQA/ftl-sdk/libftl/ftl_private.h:135:43: warning: VA_ARGS can only appear in the expansion of a C99 variadic macro [enabled by default]
#define vsnprintf_s(buf, bufsz, cnt, fmt, VA_ARGS) vsnprintf(buf, cnt, fmt, VA_ARGS)
^
/var/lib/jenkins/workspace/tl-sdk_fixoacrbuildwarnings-4OYIR3M7N4Z4DCVGVF3LAQBGZZPEVQSZO7DAGCWVR4O427WAWWQA/ftl-sdk/libftl/ftl_private.h:135:81: warning: VA_ARGS can only appear in the expansion of a C99 variadic macro [enabled by default]
#define vsnprintf_s(buf, bufsz, cnt, fmt, VA_ARGS) vsnprintf(buf, cnt, fmt, VA_ARGS)
^
/var/lib/jenkins/workspace/tl-sdk_fixoacrbuildwarnings-4OYIR3M7N4Z4DCVGVF3LAQBGZZPEVQSZO7DAGCWVR4O427WAWWQA/ftl-sdk/libftl/logging.c: In function ‘ftl_log_msg’:
/var/lib/jenkins/workspace/tl-sdk_fixoacrbuildwarnings-4OYIR3M7N4Z4DCVGVF3LAQBGZZPEVQSZO7DAGCWVR4O427WAWWQA/ftl-sdk/libftl/logging.c:35:59: error: ‘_TRUNCATE’ undeclared (first use in this function)
vsnprintf_s(m.msg.log.string, sizeof(m.msg.log.string), _TRUNCATE, fmt, args);
^
/var/lib/jenkins/workspace/tl-sdk_fixoacrbuildwarnings-4OYIR3M7N4Z4DCVGVF3LAQBGZZPEVQSZO7DAGCWVR4O427WAWWQA/ftl-sdk/libftl/ftl_private.h:135:71: note: in definition of macro ‘vsnprintf_s’
#define vsnprintf_s(buf, bufsz, cnt, fmt, VA_ARGS) vsnprintf(buf, cnt, fmt, VA_ARGS)
^
/var/lib/jenkins/workspace/tl-sdk_fixoacrbuildwarnings-4OYIR3M7N4Z4DCVGVF3LAQBGZZPEVQSZO7DAGCWVR4O427WAWWQA/ftl-sdk/libftl/logging.c:35:59: note: each undeclared identifier is reported only once for each function it appears in
vsnprintf_s(m.msg.log.string, sizeof(m.msg.log.string), _TRUNCATE, fmt, args);
^
/var/lib/jenkins/workspace/tl-sdk_fixoacrbuildwarnings-4OYIR3M7N4Z4DCVGVF3LAQBGZZPEVQSZO7DAGCWVR4O427WAWWQA/ftl-sdk/libftl/ftl_private.h:135:71: note: in definition of macro ‘vsnprintf_s’
#define vsnprintf_s(buf, bufsz, cnt, fmt, VA_ARGS) vsnprintf(buf, cnt, fmt, VA_ARGS)
^
make[2]: *** [CMakeFiles/ftl.dir/libftl/logging.c.o] Error 1
@QuinnDamerell-MS New commit is up. Can you see if Linux still throws those build errors?
View command line instructions
Manual merge helper
Use this merge commit message when completing the merge manually.
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.