]> granicus.if.org Git - php/commitdiff
Fix release build failure
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 10 Dec 2019 12:49:40 +0000 (13:49 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 10 Dec 2019 12:51:09 +0000 (13:51 +0100)
GCC complained about potentially uninitialized __orig_bailout,
even though the variable has an initializer. This warning was
quite persistent, I was only able to avoid it by using a separate
function.

Am I missing something?

ext/opcache/ZendAccelerator.c
ext/opcache/tests/preload_004.phpt
ext/opcache/tests/preload_loadable_classes_2.phpt

index df8d3c77460e6cb07269e65274d24deefb3c9b19..3f65123aed6c2f888c78eece9cd001532c0a7420 100644 (file)
@@ -3870,6 +3870,15 @@ static void preload_check_windows_restrictions(zend_class_entry *scope) {
 }
 #endif
 
+static inline int preload_update_class_constants(zend_class_entry *ce) {
+       /* This is a separate function to work around what appears to be a bug in GCC
+        * maybe-uninitialized analysis. */
+       zend_try {
+               return zend_update_class_constants(ce);
+       } zend_end_try();
+       return FAILURE;
+}
+
 static zend_class_entry *preload_load_prop_type(zend_property_info *prop, zend_string *name) {
        zend_class_entry *ce;
        if (zend_string_equals_literal_ci(name, "self")) {
@@ -3915,18 +3924,7 @@ static void preload_ensure_classes_loadable() {
 #endif
 
                        if (!(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
-                               int result = SUCCESS;
-                               zend_try {
-                                       result = zend_update_class_constants(ce);
-                               } zend_catch {
-                                       /* Provide some context for the generated error. */
-                                       zend_error_noreturn(E_ERROR,
-                                               "Error generated while resolving initializers of class %s during preloading",
-                                               ZSTR_VAL(ce->name));
-                               } zend_end_try();
-                               if (result == FAILURE) {
-                                       /* Just present to be safe: We generally always throw some
-                                        * other fatal error as part of update_class_constants(). */
+                               if (preload_update_class_constants(ce) == FAILURE) {
                                        zend_error_noreturn(E_ERROR,
                                                "Failed to resolve initializers of class %s during preloading",
                                                ZSTR_VAL(ce->name));
index df92abdc28f5e91e6bfcd0fbdab3b741385dc7ec..7242d071cb10be48e77c80b21da109193984e754 100644 (file)
@@ -14,4 +14,4 @@ var_dump(class_exists('Foo'));
 --EXPECTF--
 Fatal error: Undefined class constant 'self::DOES_NOT_EXIST' in Unknown on line 0
 
-Fatal error: Error generated while resolving initializers of class Foo during preloading in Unknown on line 0
+Fatal error: Failed to resolve initializers of class Foo during preloading in Unknown on line 0
index 4a5d2b8a667a080e6d316dd5852c6f924cf11b53..fc3fb1dc40ab7e227eaf7965472bca94b1055696 100644 (file)
@@ -14,4 +14,4 @@ Warning: Use of undefined constant UNDEF - assumed 'UNDEF' (this will throw an E
 
 Fatal error: Class 'Foo' not found in Unknown on line 0
 
-Fatal error: Error generated while resolving initializers of class Test during preloading in Unknown on line 0
+Fatal error: Failed to resolve initializers of class Test during preloading in Unknown on line 0