< prev index next >
test/hotspot/jtreg/vmTestbase/nsk/share/jni/ExceptionCheckingJniEnv.cpp
Print this page
rev 52432 : 8213622: Windows VS2013 build failure - "'snprintf': identifier not found"
Summary:
Reviewed-by:
@@ -21,10 +21,11 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include <stdlib.h>
+#include <string.h>
#include "ExceptionCheckingJniEnv.hpp"
namespace {
@@ -46,24 +47,43 @@
ProcessReturnError();
}
}
void ProcessReturnError() {
- int len = snprintf(NULL, 0, "%s : %s", _base_msg, _return_error) + 1;
+ // This is error prone, but:
+ // - Seems like we cannot use std::string (due to windows/solaris not
+ // building when used, seemingly due to exception libraries not linking).
+ // - Seems like we cannot use sprintf due to VS2013 (JDK-8213622).
+ //
+ // We are aiming to do:
+ // snprintf(full_message, len, "%s : %s", _base_msg, _return_error);
+ // but will use strlen + strncpy instead.
+ size_t base_len = strlen(_base_msg);
+ const char* between_msg = " : ";
+ size_t between_len = strlen(between_msg);
+ size_t return_len = strlen(_return_error) + 1;
- if (len <= 0) {
- _env->HandleError(_return_error);
- return;
- }
+ size_t len = base_len + between_len + return_len;
char* full_message = (char*) malloc(len);
if (full_message == NULL) {
_env->HandleError(_return_error);
return;
}
- snprintf(full_message, len, "%s : %s", _base_msg, _return_error);
+ // Now we construct the string using strcpy to not use sprintf/std::string
+ // instead of:
+ // snprintf(full_message, len, "%s : %s", _base_msg, _return_error);
+ strncpy(full_message, _base_msg, base_len);
+ strncpy(full_message + base_len, between_msg, between_len);
+ strncpy(full_message + base_len + between_len, _return_error, return_len);
+ full_message[len] = '\0';
+
+ // -1 due to the '\0' not counted by strlen but is counted for the allocation.
+ if (strlen(full_message) != len - 1) {
+ _env->GetJNIEnv()->FatalError("Length of message is not what was expected");
+ }
_env->HandleError(full_message);
free(full_message);
}
< prev index next >