docs: def check_ancillary_variables(self, ds):
          '''
          Checks the ancillary_variable attribute for all variables to ensure
          they are CF compliant.
  
          CF §3.4 It is a string attribute whose value is a blank separated list
          of variable names.  The nature of the relationship between variables
          associated via ancillary_variables must be determined by other
          attributes. The variables listed by the ancillary_variables attribute
          will often have the standard name of the variable which points to them
          including a modifier (Appendix C, Standard Name Modifiers) to indicate
          the relationship.
  
          :param netCDF4.Dataset ds: An open netCDF dataset
          :rtype: list
          :return: List of results
          '''
          ret_val = []
  
          for ncvar in ds.get_variables_by_attributes(ancillary_variables=lambda x: x is not None):
              name = ncvar.name
              valid_ancillary = TestCtx(BaseCheck.HIGH, self.section_titles["3.4"])
              ancillary_variables = ncvar.ancillary_variables
  
              valid_ancillary.assert_true(isinstance(ancillary_variables, basestring),
                                          "ancillary_variables attribute defined by {} "
                                          "should be string".format(name))
  
              # Can't perform the second check if it's not a string
              if not isinstance(ancillary_variables, basestring):
                  ret_val.append(valid_ancillary.to_result())
                  continue
  
              for ancillary_variable in ancillary_variables.split():
                  valid_ancillary.assert_true(ancillary_variable in ds.variables,
                                              "{} is not a variable in this dataset".format(ancillary_variable))
  
              ret_val.append(valid_ancillary.to_result())
  
          return ret_val