Add test for deferred close that returns error

This commit is contained in:
Michael B. Gale
2023-01-05 15:48:45 +00:00
parent e05bce9863
commit c252ec0414
2 changed files with 55 additions and 46 deletions

View File

@@ -1,31 +1,31 @@
edges
| tests.go:9:2:9:74 | ... := ...[0] : pointer type | tests.go:10:9:10:9 | f : pointer type |
| tests.go:10:9:10:9 | f : pointer type | tests.go:34:5:34:38 | ... := ...[0] : pointer type |
| tests.go:10:9:10:9 | f : pointer type | tests.go:51:5:51:38 | ... := ...[0] : pointer type |
| tests.go:10:9:10:9 | f : pointer type | tests.go:77:5:77:38 | ... := ...[0] : pointer type |
| tests.go:10:9:10:9 | f : pointer type | tests.go:87:5:87:38 | ... := ...[0] : pointer type |
| tests.go:10:9:10:9 | f : pointer type | tests.go:99:5:99:38 | ... := ...[0] : pointer type |
| tests.go:10:9:10:9 | f : pointer type | tests.go:115:5:115:38 | ... := ...[0] : pointer type |
| tests.go:18:2:18:69 | return statement[0] : pointer type | tests.go:44:5:44:42 | ... := ...[0] : pointer type |
| tests.go:18:2:18:69 | return statement[0] : pointer type | tests.go:61:5:61:42 | ... := ...[0] : pointer type |
| tests.go:10:9:10:9 | f : pointer type | tests.go:43:5:43:38 | ... := ...[0] : pointer type |
| tests.go:10:9:10:9 | f : pointer type | tests.go:60:5:60:38 | ... := ...[0] : pointer type |
| tests.go:10:9:10:9 | f : pointer type | tests.go:86:5:86:38 | ... := ...[0] : pointer type |
| tests.go:10:9:10:9 | f : pointer type | tests.go:96:5:96:38 | ... := ...[0] : pointer type |
| tests.go:10:9:10:9 | f : pointer type | tests.go:108:5:108:38 | ... := ...[0] : pointer type |
| tests.go:10:9:10:9 | f : pointer type | tests.go:124:5:124:38 | ... := ...[0] : pointer type |
| tests.go:18:2:18:69 | return statement[0] : pointer type | tests.go:53:5:53:42 | ... := ...[0] : pointer type |
| tests.go:18:2:18:69 | return statement[0] : pointer type | tests.go:70:5:70:42 | ... := ...[0] : pointer type |
| tests.go:21:24:21:24 | definition of f : pointer type | tests.go:22:8:22:8 | f |
| tests.go:25:32:25:32 | definition of f : pointer type | tests.go:26:13:26:13 | capture variable f : pointer type |
| tests.go:26:13:26:13 | capture variable f : pointer type | tests.go:27:3:27:3 | f |
| tests.go:34:5:34:38 | ... := ...[0] : pointer type | tests.go:35:21:35:21 | f : pointer type |
| tests.go:34:5:34:38 | ... := ...[0] : pointer type | tests.go:36:29:36:29 | f : pointer type |
| tests.go:35:21:35:21 | f : pointer type | tests.go:21:24:21:24 | definition of f : pointer type |
| tests.go:36:29:36:29 | f : pointer type | tests.go:25:32:25:32 | definition of f : pointer type |
| tests.go:44:5:44:42 | ... := ...[0] : pointer type | tests.go:45:21:45:21 | f : pointer type |
| tests.go:44:5:44:42 | ... := ...[0] : pointer type | tests.go:46:29:46:29 | f : pointer type |
| tests.go:45:21:45:21 | f : pointer type | tests.go:21:24:21:24 | definition of f : pointer type |
| tests.go:46:29:46:29 | f : pointer type | tests.go:25:32:25:32 | definition of f : pointer type |
| tests.go:51:5:51:38 | ... := ...[0] : pointer type | tests.go:53:3:53:3 | f |
| tests.go:61:5:61:42 | ... := ...[0] : pointer type | tests.go:63:3:63:3 | f |
| tests.go:77:5:77:38 | ... := ...[0] : pointer type | tests.go:80:4:80:4 | f |
| tests.go:77:5:77:38 | ... := ...[0] : pointer type | tests.go:82:3:82:3 | f |
| tests.go:87:5:87:38 | ... := ...[0] : pointer type | tests.go:90:9:90:9 | f |
| tests.go:99:5:99:38 | ... := ...[0] : pointer type | tests.go:101:9:101:9 | f |
| tests.go:115:5:115:38 | ... := ...[0] : pointer type | tests.go:119:3:119:3 | f |
| tests.go:43:5:43:38 | ... := ...[0] : pointer type | tests.go:44:21:44:21 | f : pointer type |
| tests.go:43:5:43:38 | ... := ...[0] : pointer type | tests.go:45:29:45:29 | f : pointer type |
| tests.go:44:21:44:21 | f : pointer type | tests.go:21:24:21:24 | definition of f : pointer type |
| tests.go:45:29:45:29 | f : pointer type | tests.go:25:32:25:32 | definition of f : pointer type |
| tests.go:53:5:53:42 | ... := ...[0] : pointer type | tests.go:54:21:54:21 | f : pointer type |
| tests.go:53:5:53:42 | ... := ...[0] : pointer type | tests.go:55:29:55:29 | f : pointer type |
| tests.go:54:21:54:21 | f : pointer type | tests.go:21:24:21:24 | definition of f : pointer type |
| tests.go:55:29:55:29 | f : pointer type | tests.go:25:32:25:32 | definition of f : pointer type |
| tests.go:60:5:60:38 | ... := ...[0] : pointer type | tests.go:62:3:62:3 | f |
| tests.go:70:5:70:42 | ... := ...[0] : pointer type | tests.go:72:3:72:3 | f |
| tests.go:86:5:86:38 | ... := ...[0] : pointer type | tests.go:89:4:89:4 | f |
| tests.go:86:5:86:38 | ... := ...[0] : pointer type | tests.go:91:3:91:3 | f |
| tests.go:96:5:96:38 | ... := ...[0] : pointer type | tests.go:99:9:99:9 | f |
| tests.go:108:5:108:38 | ... := ...[0] : pointer type | tests.go:110:9:110:9 | f |
| tests.go:124:5:124:38 | ... := ...[0] : pointer type | tests.go:128:3:128:3 | f |
nodes
| tests.go:9:2:9:74 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:10:9:10:9 | f : pointer type | semmle.label | f : pointer type |
@@ -35,32 +35,32 @@ nodes
| tests.go:25:32:25:32 | definition of f : pointer type | semmle.label | definition of f : pointer type |
| tests.go:26:13:26:13 | capture variable f : pointer type | semmle.label | capture variable f : pointer type |
| tests.go:27:3:27:3 | f | semmle.label | f |
| tests.go:34:5:34:38 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:35:21:35:21 | f : pointer type | semmle.label | f : pointer type |
| tests.go:36:29:36:29 | f : pointer type | semmle.label | f : pointer type |
| tests.go:44:5:44:42 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:45:21:45:21 | f : pointer type | semmle.label | f : pointer type |
| tests.go:46:29:46:29 | f : pointer type | semmle.label | f : pointer type |
| tests.go:51:5:51:38 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:53:3:53:3 | f | semmle.label | f |
| tests.go:61:5:61:42 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:63:3:63:3 | f | semmle.label | f |
| tests.go:77:5:77:38 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:80:4:80:4 | f | semmle.label | f |
| tests.go:82:3:82:3 | f | semmle.label | f |
| tests.go:87:5:87:38 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:90:9:90:9 | f | semmle.label | f |
| tests.go:99:5:99:38 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:101:9:101:9 | f | semmle.label | f |
| tests.go:115:5:115:38 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:119:3:119:3 | f | semmle.label | f |
| tests.go:43:5:43:38 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:44:21:44:21 | f : pointer type | semmle.label | f : pointer type |
| tests.go:45:29:45:29 | f : pointer type | semmle.label | f : pointer type |
| tests.go:53:5:53:42 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:54:21:54:21 | f : pointer type | semmle.label | f : pointer type |
| tests.go:55:29:55:29 | f : pointer type | semmle.label | f : pointer type |
| tests.go:60:5:60:38 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:62:3:62:3 | f | semmle.label | f |
| tests.go:70:5:70:42 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:72:3:72:3 | f | semmle.label | f |
| tests.go:86:5:86:38 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:89:4:89:4 | f | semmle.label | f |
| tests.go:91:3:91:3 | f | semmle.label | f |
| tests.go:96:5:96:38 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:99:9:99:9 | f | semmle.label | f |
| tests.go:108:5:108:38 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:110:9:110:9 | f | semmle.label | f |
| tests.go:124:5:124:38 | ... := ...[0] : pointer type | semmle.label | ... := ...[0] : pointer type |
| tests.go:128:3:128:3 | f | semmle.label | f |
subpaths
#select
| tests.go:22:8:22:8 | f | tests.go:9:2:9:74 | ... := ...[0] : pointer type | tests.go:22:8:22:8 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:9:12:9:74 | call to OpenFile | call to OpenFile |
| tests.go:22:8:22:8 | f | tests.go:18:2:18:69 | return statement[0] : pointer type | tests.go:22:8:22:8 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:18:9:18:69 | call to OpenFile | call to OpenFile |
| tests.go:27:3:27:3 | f | tests.go:9:2:9:74 | ... := ...[0] : pointer type | tests.go:27:3:27:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:9:12:9:74 | call to OpenFile | call to OpenFile |
| tests.go:27:3:27:3 | f | tests.go:18:2:18:69 | return statement[0] : pointer type | tests.go:27:3:27:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:18:9:18:69 | call to OpenFile | call to OpenFile |
| tests.go:53:3:53:3 | f | tests.go:9:2:9:74 | ... := ...[0] : pointer type | tests.go:53:3:53:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:9:12:9:74 | call to OpenFile | call to OpenFile |
| tests.go:63:3:63:3 | f | tests.go:18:2:18:69 | return statement[0] : pointer type | tests.go:63:3:63:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:18:9:18:69 | call to OpenFile | call to OpenFile |
| tests.go:101:9:101:9 | f | tests.go:9:2:9:74 | ... := ...[0] : pointer type | tests.go:101:9:101:9 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:9:12:9:74 | call to OpenFile | call to OpenFile |
| tests.go:119:3:119:3 | f | tests.go:9:2:9:74 | ... := ...[0] : pointer type | tests.go:119:3:119:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:9:12:9:74 | call to OpenFile | call to OpenFile |
| tests.go:62:3:62:3 | f | tests.go:9:2:9:74 | ... := ...[0] : pointer type | tests.go:62:3:62:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:9:12:9:74 | call to OpenFile | call to OpenFile |
| tests.go:72:3:72:3 | f | tests.go:18:2:18:69 | return statement[0] : pointer type | tests.go:72:3:72:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:18:9:18:69 | call to OpenFile | call to OpenFile |
| tests.go:110:9:110:9 | f | tests.go:9:2:9:74 | ... := ...[0] : pointer type | tests.go:110:9:110:9 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:9:12:9:74 | call to OpenFile | call to OpenFile |
| tests.go:128:3:128:3 | f | tests.go:9:2:9:74 | ... := ...[0] : pointer type | tests.go:128:3:128:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:9:12:9:74 | call to OpenFile | call to OpenFile |

View File

@@ -30,6 +30,15 @@ func closeFileDeferredIndirect(f *os.File) {
defer cont()
}
func closeFileDeferredIndirectReturn(f *os.File) {
var cont = func() error {
return f.Close() // OK, because this function returns the error
}
// different (more general) problem: deferred error
defer cont()
}
func deferredCalls() {
if f, err := openFileWrite("foo.txt"); err != nil {
closeFileDeferred(f) // NOT OK