< 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,30 **** --- 21,31 ---- * 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,69 **** ProcessReturnError(); } } void ProcessReturnError() { ! int len = snprintf(NULL, 0, "%s : %s", _base_msg, _return_error) + 1; ! if (len <= 0) { ! _env->HandleError(_return_error); ! return; ! } 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); _env->HandleError(full_message); free(full_message); } --- 47,90 ---- ProcessReturnError(); } } void ProcessReturnError() { ! // 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 + memcpy 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 for the '\0' ! size_t len = base_len + between_len + return_len + 1; char* full_message = (char*) malloc(len); if (full_message == NULL) { _env->HandleError(_return_error); return; } ! // Now we construct the string using memcpy to not use sprintf/std::string ! // instead of: ! // snprintf(full_message, len, "%s : %s", _base_msg, _return_error); ! memcpy(full_message, _base_msg, base_len); ! memcpy(full_message + base_len, between_msg, between_len); ! memcpy(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 >