summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett Regier <garrett.regier@riftio.com>2015-07-06 18:54:23 -0700
committerColin Walters <walters@verbum.org>2015-10-04 17:34:12 -0400
commit09c466f0184e74ba6f279f103ad3be3a7e1f2a06 (patch)
tree717499c4cb224dd35ffef2feed10bc0a274b62ae
parent849f1eef10b18eddaf41c1e0b2cca87bf5d93739 (diff)
downloadgobject-introspection-09c466f0184e74ba6f279f103ad3be3a7e1f2a06.tar.gz
scanner: Warn and ignore return annotations when there is no return value
Otherwise the .gir can contain invalid data which would likely cause a crash at runtime. https://bugzilla.gnome.org/show_bug.cgi?id=752044 Signed-off-by: Garrett Regier <garrett.regier@riftio.com>
-rw-r--r--giscanner/codegen.py9
-rw-r--r--giscanner/maintransformer.py7
-rw-r--r--tests/warn/Makefile.am1
-rw-r--r--tests/warn/invalid-return.h19
4 files changed, 31 insertions, 5 deletions
diff --git a/giscanner/codegen.py b/giscanner/codegen.py
index ff1a435a..0d4a8d8b 100644
--- a/giscanner/codegen.py
+++ b/giscanner/codegen.py
@@ -108,10 +108,11 @@ class CCodeGenerator(object):
self._write_annotation_transfer(param)
self.out_c.write(":\n")
self.out_c.write(' *\n')
- self.out_c.write(' * Undocumented.\n')
- self.out_c.write(' *\n')
- self.out_c.write(' * Returns:')
- self._write_annotation_transfer(func.retval)
+ self.out_c.write(' * Undocumented.')
+ if func.retval.type != ast.TYPE_NONE:
+ self.out_c.write('\n *\n')
+ self.out_c.write(' * Returns: ')
+ self._write_annotation_transfer(func.retval)
self.out_c.write('\n */')
@contextmanager
diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py
index 872395a0..bb79a5b3 100644
--- a/giscanner/maintransformer.py
+++ b/giscanner/maintransformer.py
@@ -784,6 +784,12 @@ class MainTransformer(object):
tag = block.tags.get(TAG_RETURNS)
else:
tag = None
+
+ if tag is not None and return_.type == ast.TYPE_NONE:
+ message.warn('%s: invalid return annotation' % (block.name,),
+ tag.position)
+ tag = None
+
self._apply_annotations_param_ret_common(parent, return_, tag)
def _apply_annotations_params(self, parent, params, block):
@@ -871,7 +877,6 @@ class MainTransformer(object):
if block:
self._apply_annotations_annotated(signal, block)
-
# We're only attempting to name the signal parameters if
# the number of parameters (@foo) is the same or greater
# than the number of signal parameters
diff --git a/tests/warn/Makefile.am b/tests/warn/Makefile.am
index fb7e989d..5f47df0a 100644
--- a/tests/warn/Makefile.am
+++ b/tests/warn/Makefile.am
@@ -14,6 +14,7 @@ TESTS = \
invalid-option.h \
invalid-optional.h \
invalid-out.h \
+ invalid-return.h \
invalid-transfer.h \
missing-element-type.h \
return-gobject.h \
diff --git a/tests/warn/invalid-return.h b/tests/warn/invalid-return.h
new file mode 100644
index 00000000..c033b767
--- /dev/null
+++ b/tests/warn/invalid-return.h
@@ -0,0 +1,19 @@
+#include "common.h"
+
+/**
+ * TestInvalidReturnCallback:
+ *
+ * Returns:
+ */
+typedef void (*TestInvalidReturnCallback) (void);
+
+// EXPECT:6: Warning: Test: TestInvalidReturnCallback: invalid return annotation
+
+/**
+ * test_invalid_return:
+ *
+ * Returns:
+ */
+void test_invalid_return (void);
+
+// EXPECT:15: Warning: Test: test_invalid_return: invalid return annotation