On Jan 4, 2014, at 7:14 AM, Alex Christensen <alex.christen...@flexsim.com> wrote:
> Call me an extremist, but I would be in favor of a complete ban on auto. I'm not totally sold on using it almost everywhere, but auto is clearly a win for types that are obnoxiously long to spell but rarely interesting per se, such as iterator types in a loop over a container. - Maciej > I've been involved in another project deciding to not use auto at all. It > forces programmers to be explicit and careful, it shows the effects of type > changes with compiler errors (exposing bugs better), and it's easy to enforce > with no debate. It's easy for me to gloss over types when reading code if I > don't care, but I don't like relying on a specific IDE feature for > information that should be grepable. I fix a lot of code I didn't write, and > I request that if we allow auto at all, that it be used sparingly in the > guideline and in the reviewers' decisions. > > Alex Christensen > >> On Jan 3, 2014, at 2:49 PM, Michael Saboff <msab...@apple.com> wrote: >> >> >> On Jan 3, 2014, at 11:28 AM, Geoffrey Garen <gga...@apple.com> wrote: >> >>>> However I also feel the "harm" here is debatable enough that people >>>> working on/reviewing the code should make decisions instead of there being >>>> a project level dictate. It is a new thing, the appropriate usage hasn't >>>> yet settled and people should be allowed to experiment. >>> >>> The experiment has been going on for some time now. We have over 1000 >>> unique uses of “auto” in the codebase. I think it’s time to clarify and >>> collect what we’ve learned. >>> >>> One reason I’m eager to produce a guideline is the patches I’ve seen >>> Andreas writing. A whole new kind of pointer in one of the most error-prone >>> pointer areas of our codebase (as measured by security exploits) deserves a >>> clear guideline for readability and understandability. >>> >>> Note that a coding style guideline does not prevent reviewers from >>> exercising good judgement — either by accepting or rejecting an edge case, >>> or by proposing a modification to the guidelines. >>> >>>> I'm not sure how much rules we really need beyond "use 'auto' when it >>>> improves code". I gather from this thread that especially people working >>>> on JSC are not comfortable using it so they shouldn’t. >>> >>> I strongly object to varying coding style arbitrarily based on author or >>> project file. That's a recipe for an unreadable polyglot codebase. >>> >>> It’s very common for WebKit engineers to work across different pieces of >>> the engine, and that is a strength in our project that I’d like to preserve >>> and extend. >>> >>>> If we start making rules I'd add the following: >>>> >>>> - Use "auto" when the type name is already mentioned on a line: >>> >>> Agreed. >>> >>>> auto& cell = toRenderTableCell(*renderer); // right >>>> RenderTableCell& cell = toRenderTableCell(*renderer); // wrong >>> >>> Not sure. >>> >>> These lines of code do not include a verbatim type name, and so they are >>> not friendly to cmd-click/select-and-search. Changing the function >>> signature to “to<RenderTableCell>”, or something like that, might help. >>> >>> There seems to be consensus that “auto& cell = >>> *static_cast<RenderTableCell*>(renderer)” would be correct — setting aside >>> the fact that we usually don’t cast like that in the render tree. >>> >>>> for (auto& source : descendantsOfType<HTMLSourceElement>(*this)) // right >>>> for (const HTMLSourceElement& source : >>>> descendantsOfType<HTMLSourceElement>(*this)) // wrong >>> >>> OK. >>> >>>> auto properties = std::make_unique<PropertiesVector>(); //right >>>> std::unique_ptr<PropertiesVector> properties = >>>> std::make_unique<PropertiesVector>(); //wrong >>> >>> OK. >>> >>>> This rule is already widely deployed and I think the code readability has >>>> improved. >>> >>> Agreed. I especially liked reading "auto buffer = >>> std::make_unique<UniChar[]>(length)” when I found it. It’s a shame that >>> mutex types and other unmovable types can’t work this way. >>> >>>> - Use "auto" when the type is irrelevant. This covers things like >>>> iterators and adapter classes: >>>> >>>> auto sourceDescendants = descendantsOfType<HTMLSourceElement >(*this)); >>> >>> I’m not sure what you mean by type being irrelevant. I’d want to make a >>> list of examples where we think type is or is not relevant. >>> >>> For example, one could argue that type is irrelevant for any pointer-style >>> class, since you just use “->” and “*”, which work for any pointer-style >>> classes, and the name conveys the interface. But I disagree. The pointer >>> type conveys the lifetime and passing semantics, and those are essential, >>> and need to be called out. >>> >>>> - Use "auto" when type is obvious for people with basic familiarity with a >>>> subsystem: >>>> >>>> auto& style = renderer.style(); >>> >>> I don’t like this. I want code to be clear even to folks who are not super >>> familiar. >>> >>> For example, recently, Michael had to fix a buffer overrun bug in low-level >>> render tree / image code, simply because the ultimate consequence was a >>> crash in JIT code. I won’t speak for Michael’s specific coding style >>> preferences, but I will say that in general we need to keep our code >>> accessible even to unfamiliar folks in order to accommodate work like that. >> >> I think you are referring to <rdar://problem/13207901> Improper copying of >> image data in ImageBufferData::getData cause crash in fastMalloc below >> JSC::FunctionBodyNode::finishParsing. That was a fun bug to track down! >> This was a malloc overrun where the allocation site did some math with one >> set of width and height and the use site used different width and height >> value for writing to the buffer. The root of this issue could have been >> prevented with better local variable names. For example, there was some >> confusion between width and destw. Looking back, several local variable >> name were not descriptive enough. t think the code was eliminated shortly >> after the fix I did went in so it is no longer an issue. >> >> Back to the “auto" discussion, I have been following closely and like where >> we are heading. The use of auto should make the code easier to read. If we >> have to rely on a tools to find the type, then we should use the type and >> not auto. Until we have a standard as to what methods like >> toRenderTableCell() or renderer.style() returns (smart pointer, pointer, >> reference or value), variables that are assigned the result of such methods >> need a type. >> >> In the case for integral values, I’m on the fence. I can see the advantage >> of the compiler making a variable the right sign and size instead of >> implicit conversions. However there are issues with the subsequent use of >> such an auto integral value. Given that, I think we want to type integral >> variables. >> >> - Michael >> >>> Geoff >>> _______________________________________________ >>> webkit-dev mailing list >>> webkit-dev@lists.webkit.org >>> https://lists.webkit.org/mailman/listinfo/webkit-dev >> >> _______________________________________________ >> webkit-dev mailing list >> webkit-dev@lists.webkit.org >> https://lists.webkit.org/mailman/listinfo/webkit-dev > _______________________________________________ > webkit-dev mailing list > webkit-dev@lists.webkit.org > https://lists.webkit.org/mailman/listinfo/webkit-dev _______________________________________________ webkit-dev mailing list webkit-dev@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-dev