The following issue has been SUBMITTED. ====================================================================== http://www.itk.org/Bug/view.php?id=13786 ====================================================================== Reported By: Andreas Mohr Assigned To: ====================================================================== Project: CMake Issue ID: 13786 Category: CMake Reproducibility: always Severity: major Priority: high Status: new ====================================================================== Date Submitted: 2012-12-12 05:01 EST Last Modified: 2012-12-12 05:01 EST ====================================================================== Summary: function() set(PARENT_SCOPE) buggy: very surprising warn-uninitialized inconsistency for (non-)empty values Description: I tried to get all my code free of issues, thus I enabled --warn-uninitialized. I was very surprised to find that initialization state of a function result (PARENT_SCOPE) variable is being very negatively influenced by the value of the passed variable being empty vs. non-empty, as can be gathered from the sample below warning about result_empty yet properly *not* warning about result_non_empty.
This should emphatically _not_ be the case - a result variable should *always* get properly initialized (instantiated) in outer scope, no fr****n' matter which value it may happen to get assigned. And it's not a "this variable already exists in outer scope" vs. "does not exist --> problem" issue: when assigning non-empty values the outer-scope variable *does* get created, yet not for empty ones --> BUG. Note that pre-initializing the result var to "" prior to invoking the function does successfully silence the initialization warning. And note that doing this initialization with a non-empty value and subsequently calling the function *does* let the function reset the variable to empty - IOW the variable *does* get assigned by the function in *this* case - just not if it didn't exist previously! Happening on both Win7 2.8.10.2 and RHEL5 2.8.8..... Severity major and prio high since it's a foundation-shattering inconsistency ;) Given this bug it's impossible to get one's code warning-free (when making use of clean result-use-only variable getter functions which happen to return empty values in certain conditions). A mere "not succeeding in getting the code warning-free" is a rather benign concern - some actively disrupting bug scenarios due to this issue might be conceivable, too. Thanks! Steps to Reproduce: cmake_minimum_required(VERSION 2.8) function(getter _result) set(result_ "${desired_result}") set(${_result} "${result_}" PARENT_SCOPE) endfunction(getter _result) #set(result_empty "bye, cruel world") # <---- toggle this! set(desired_result "") getter(result_empty) set(desired_result "non-empty") getter(result_non_empty) message("result_empty ${result_empty}, result_non_empty ${result_non_empty}.") Additional Information: $ cmake --warn-uninitialized . Warn about uninitialized values. CMake Warning (dev) at /home/amoh/privat/cmake_tests/bug_function_result_uninitialized_warning/CMakeLists.txt:14: uninitialized variable 'result_empty' This warning is for project developers. Use -Wno-dev to suppress it. result_empty , result_non_empty non-empty. -- Configuring done -- Generating done ====================================================================== Issue History Date Modified Username Field Change ====================================================================== 2012-12-12 05:01 Andreas Mohr New Issue ====================================================================== -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers