Closed
Bug 1496598
Opened 7 years ago
Closed 7 years ago
Port bug 1493226 - Fix static analysis errors
Categories
(MailNews Core :: General, task)
MailNews Core
General
Tracking
(Not tracked)
RESOLVED
FIXED
Thunderbird 64.0
People
(Reporter: jorgk-bmo, Assigned: jorgk-bmo)
Details
Attachments
(3 files, 3 obsolete files)
|
10.06 KB,
patch
|
jorgk-bmo
:
review+
|
Details | Diff | Splinter Review |
|
102.74 KB,
patch
|
Details | Diff | Splinter Review | |
|
96.59 KB,
patch
|
benc
:
review+
aceman
:
feedback+
|
Details | Diff | Splinter Review |
Patch coming.
| Assignee | ||
Comment 1•7 years ago
|
||
Ben, can you please take a look at this. It doesn't compile yet, the trickery in JS Account fell over big time ... and at 2 AM I need to leave it.
Also, can you check the patch.
There were a few cases where the QI had an rv, and I did this:
- nsCOMPtr <nsIFile> file = do_QueryInterface(aLocalFile, &rv);
- NS_ENSURE_SUCCESS(rv,rv);
+ nsCOMPtr <nsIFile> file = aLocalFile;
Or should this be
+ nsCOMPtr <nsIFile> file = aLocalFile;
+ NS_ENSURE_TRUE(file, NS_ERROR_NULL_POINTER);
In other words, what did the QI do with nulls?
Assignee: nobody → jorgk
Attachment #9014625 -
Flags: review?(benc)
Attachment #9014625 -
Flags: feedback?(continuation)
| Assignee | ||
Comment 2•7 years ago
|
||
Same patch with |hg qdiff -w|, so you don't see the indentation changes.
| Assignee | ||
Comment 3•7 years ago
|
||
That's the no white-space changes patch.
Attachment #9014627 -
Attachment is obsolete: true
Comment 4•7 years ago
|
||
(In reply to Jorg K (GMT+2) from comment #1)
> In other words, what did the QI do with nulls?
Interesting point. I didn't think about that when I was fixing similar calls in bug 1496598. It looks like QIing a null via do_QueryInterface actually does return an error, so NS_ENSURE_TRUE(file, NS_ERROR_NULL_POINTER); is the safer way to go, especially when the value is from an argument like this. In the case of nsAbLDAPReplicationData.cpp, the value being QId is a return value from something else, and the other method has its return error checked, so that's probably okay.
Updated•7 years ago
|
Attachment #9014625 -
Flags: feedback?(continuation) → feedback+
Comment 5•7 years ago
|
||
Just to confirm what Andrew said:
My reading is that QI(xxx,&rv) will return NS_ERROR_NULL_POINTER in rv if xxx is null.
(https://dxr.mozilla.org/mozilla-central/source/xpcom/base/nsCOMPtr.cpp#29)
Comment 6•7 years ago
|
||
This patch gets it compiling again for me.
I ran out of time and so:
- it hasn't seen any proper testing yet
- I haven't gone over your patch to check out the QI return codes yet.
But hopefully this sorts out the worst of the bustage.
Phew. It was a good one to dig through - templates, multiple inheritance, nested macros, all that great C++ stuff!
Will check in a bit later to help mop up.
Attachment #9014680 -
Flags: feedback?(jorgk)
| Assignee | ||
Comment 7•7 years ago
|
||
Comment on attachment 9014680 [details] [diff] [review]
js_delegate_fiddling.patch
Thanks, this compiles for me. You don't really need the _jsmethods parameter to the macro, since mMethods is always used, but like this you can get rid of the hard-coding.
Attachment #9014680 -
Flags: feedback?(jorgk) → feedback+
Comment 8•7 years ago
|
||
Yes, I figured that on balance it was nicer to be explicit about it. Less magic. Not that it makes tooo much difference - DELEGATE_JS is such an ultra-specific macro anyway :-)
There's definitely scope to ditch the remaining do_QueryInterface calls there. We know the type of the target object (mCppBase) at compile time. But it's diminishing returns. The existing code is solid, and I can't imagine it's much of a performance bottleneck. If someone decides it is, I'll be happy to jump back in and turn them all into static casts!
| Assignee | ||
Comment 9•7 years ago
|
||
I think the review will be even less fun than writing this. Compared to the WIP I went through with the fine-comb and added error checking where the QI was really a glorified null check.
Then it occurred to me that a whole heap of variables were unneeded, so I removed all those. There was a whole heap of other junk that went out the door with it.
I'll put r? onto the no-ws patch since that will be easier to read.
Attachment #9014625 -
Attachment is obsolete: true
Attachment #9014625 -
Flags: review?(benc)
| Assignee | ||
Comment 10•7 years ago
|
||
Tries:
https://treeherder.mozilla.org/#/jobs?repo=try-comm-central&revision=52b1032426e96155d40603993dc75a674d493cfb
That failed due to Apple-only code, so one more:
https://treeherder.mozilla.org/#/jobs?repo=try-comm-central&revision=1ffc4516b7f49fbc0793395880bc8dba76ce75d3
Attachment #9014630 -
Attachment is obsolete: true
Attachment #9014725 -
Flags: review?(benc)
Attachment #9014725 -
Flags: feedback?(acelists)
| Assignee | ||
Comment 11•7 years ago
|
||
Comment on attachment 9014725 [details] [diff] [review]
no-ws.patch
Review of attachment 9014725 [details] [diff] [review]:
-----------------------------------------------------------------
Looks OK to me. Added some comments for stuff that's no immediately evident.
::: mailnews/imap/src/nsImapIncomingServer.cpp
@@ +693,2 @@
> RemoveConnection(aConnection);
> + aConnection->TellThreadToDie(false);
aConnection was checked on entry to the function. You don't see it here.
::: mailnews/mapi/mapihook/src/msgMapiImp.cpp
@@ -704,2 @@
>
> - if (inputStream)
This test doesn't make sense. 'fileStream' can't be null, otherwise we would have crashed above.
Comment 12•7 years ago
|
||
Pushed by mozilla@jorgk.com:
https://hg.mozilla.org/comm-central/rev/f77c18acceaf
Port bug 1493226: fix 'don't use do_QueryInterface for compile-time-determinable casts' errors. rs=bustage-fix
https://hg.mozilla.org/comm-central/rev/93daa9a87d52
Port bug 1493226: remove needless QueryInterface calls in JS delegation. r=jorgk
Status: NEW → RESOLVED
Closed: 7 years ago
Resolution: --- → FIXED
| Assignee | ||
Updated•7 years ago
|
Target Milestone: --- → Thunderbird 64.0
| Assignee | ||
Updated•7 years ago
|
Attachment #9014680 -
Flags: feedback+ → review+
Comment 13•7 years ago
|
||
Comment on attachment 9014725 [details] [diff] [review]
no-ws.patch
Review of attachment 9014725 [details] [diff] [review]:
-----------------------------------------------------------------
This m-c change at least simplifies the code and if it makes tighter checks and faster code then even better.
Thanks for tackling this.
::: mailnews/base/search/src/nsMsgFilterService.cpp
@@ +235,5 @@
> nsMsgFilterService::ThrowAlertMsg(const char*aMsgName, nsIMsgWindow *aMsgWindow)
> {
> nsString alertString;
> nsresult rv = GetStringFromBundle(aMsgName, alertString);
> + nsCOMPtr<nsIMsgWindow> msgWindow = aMsgWindow;
What does this do now? Both variables are of the same type. Is msgWindow needed?
::: mailnews/imap/src/nsImapIncomingServer.cpp
@@ +633,5 @@
>
> if (NS_SUCCEEDED(aImapUrl->GetMockChannel(getter_AddRefs(mockChannel))) && mockChannel)
> {
> nsresult requestStatus;
> + mockChannel->GetStatus(&requestStatus);
Isn't this losing the null check?
::: mailnews/imap/src/nsImapMailFolder.cpp
@@ +436,5 @@
> {
> nsCOMPtr<nsISupports> supports;
> rv = children->GetNext(getter_AddRefs(supports));
> + currentFolderPath = do_QueryInterface(supports);
> + if (NS_FAILED(rv) || !currentFolderPath)
This looks ugly going through nsISupports. It seems we should use GetNextFile() on nsIDirectoryEnumerator instead of generic GetNext(), m-c has such patterns.
But I can do this in a new bug as we have many occurences of this old pattern where it could be simplified. We didn't do it when nsIDirectoryEnumerator was made to be returned from GetDirectoryEntries.
Attachment #9014725 -
Flags: feedback?(acelists) → feedback+
| Assignee | ||
Comment 14•7 years ago
|
||
This bug is a really pain since you need to see the full context of the file :-(
(In reply to :aceman from comment #13)
> > + nsCOMPtr<nsIMsgWindow> msgWindow = aMsgWindow;
> What does this do now? Both variables are of the same type. Is msgWindow
> needed?
Needed.
nsCOMPtr<nsIMsgWindow> msgWindow = aMsgWindow;
if (!msgWindow) {
nsCOMPtr<nsIMsgMailSession> mailSession ( do_GetService(NS_MSGMAILSESSION_CONTRACTID, &rv));
if (NS_SUCCEEDED(rv))
rv = mailSession->GetTopmostMsgWindow(getter_AddRefs(msgWindow));
}
You can even see it in the review tool.
> > + mockChannel->GetStatus(&requestStatus);
> Isn't this losing the null check?
This never had an rv and was never checking it.
Right above you have:
if (NS_SUCCEEDED(aImapUrl->GetMockChannel(getter_AddRefs(mockChannel))) && mockChannel)
You can see that in the review tool.
> This looks ugly going through nsISupports. ...
> But I can do this in a new bug ...
Indeed, remember: bustage fix, I already removed the biggest nonsense.
Comment 15•7 years ago
|
||
(In reply to Jorg K (GMT+2) from comment #14)
> This bug is a really pain since you need to see the full context of the file
> :-(
True.
> (In reply to :aceman from comment #13)
> nsCOMPtr<nsIMsgWindow> msgWindow = aMsgWindow;
> if (!msgWindow) {
> nsCOMPtr<nsIMsgMailSession> mailSession (
> do_GetService(NS_MSGMAILSESSION_CONTRACTID, &rv));
> if (NS_SUCCEEDED(rv))
> rv = mailSession->GetTopmostMsgWindow(getter_AddRefs(msgWindow));
> }
> You can even see it in the review tool.
Yes, sorry, it didn't occur to me to look below the line.
> > > + mockChannel->GetStatus(&requestStatus);
> > Isn't this losing the null check?
> This never had an rv and was never checking it.
> Right above you have:
> if (NS_SUCCEEDED(aImapUrl->GetMockChannel(getter_AddRefs(mockChannel))) &&
> mockChannel)
> You can see that in the review tool.
Not rv, but it was checking the 'request'. But I see now it checks mockChannel for null in the if().
> > This looks ugly going through nsISupports. ...
> > But I can do this in a new bug ...
> Indeed, remember: bustage fix, I already removed the biggest nonsense.
Sure, I just better write it when the idea comes to my mind before I forget it in the N hours I come to dev PC :)
Comment 16•7 years ago
|
||
Comment on attachment 9014725 [details] [diff] [review]
no-ws.patch
Review of attachment 9014725 [details] [diff] [review]:
-----------------------------------------------------------------
Just to confirm: looks good to me too.
(and nice seeing so many runtime type-checks removed!)
::: mailnews/base/search/src/nsMsgFilterService.cpp
@@ +235,5 @@
> nsMsgFilterService::ThrowAlertMsg(const char*aMsgName, nsIMsgWindow *aMsgWindow)
> {
> nsString alertString;
> nsresult rv = GetStringFromBundle(aMsgName, alertString);
> + nsCOMPtr<nsIMsgWindow> msgWindow = aMsgWindow;
I've got a newbie question on this one:
It seems that the rest of the function could happily use the raw `aMsgWindow` var, saving the creation of `msgWindow`.
Was `msgWindow` kept to keep the patch simple and non-intrusive, or is it considered better practice to wrap raw pointers with `nsCOMPtr<>` within functions like this?
(can't see it making any difference either way to the final generated code, so I guess it comes down to stylistic/footgun-protection issues)
Attachment #9014725 -
Flags: review?(benc) → review+
| Assignee | ||
Comment 17•7 years ago
|
||
Umm, I think the
rv = mailSession->GetTopmostMsgWindow(getter_AddRefs(msgWindow));
a few lines down makes it necessary, no?
Updated•6 years ago
|
Type: enhancement → task
You need to log in
before you can comment on or make changes to this bug.
Description
•