• Show log

    Commit

  • Hash : 585b5dac
    Author : Patrick Steinhardt
    Date : 2017-11-18T15:43:11

    refcount: make refcounting conform to aliasing rules
    
    Strict aliasing rules dictate that for most data types, you are not
    allowed to cast them to another data type and then access the casted
    pointers. While this works just fine for most compilers, technically we
    end up in undefined behaviour when we hurt that rule.
    
    Our current refcounting code makes heavy use of casting and thus
    violates that rule. While we didn't have any problems with that code,
    Travis started spitting out a lot of warnings due to a change in their
    toolchain. In the refcounting case, the code is also easy to fix:
    as all refcounting-statements are actually macros, we can just access
    the `rc` field directly instead of casting.
    
    There are two outliers in our code where that doesn't work. Both the
    `git_diff` and `git_patch` structures have specializations for generated
    and parsed diffs/patches, which directly inherit from them. Because of
    that, the refcounting code is only part of the base structure and not of
    the children themselves. We can help that by instead passing their base
    into `GIT_REFCOUNT_INC`, though.